#1. Data wrangling ##1.1 Loading the required packages

#install.packages("pacman")
pacman::p_load(tidyverse, ggplot2, brms, cmdstanr, broom, broom.mixed, tidybayes, ggthemes, emmeans, ggdist, gridExtra, bayesplot, see, patchwork, ggtext, extraDistr, gghalves, ggpp, rstan) 

#remotes::install_github("stan-dev/loo")
# Setting colours for vidsalisations
colour1 <- "#97A275"
colour2 <- "#F2B23A"
colour3 <- "#F2711B"
colour4 <- "#8CBEB2"
colour5 <- "#E7C27D"
colour6 <- "#F2A775"
colour11 <- "#666E4F"
colour12 <- "#A38346"
colour13 <- "#9C4811"

##1.2 Unblinding the data

#assigning the directory so that the code can be universally read on any computer as long as the entire project file is shared
directory <- './2-data/'

#reading in the coded raw BORIS output
BORIS_output <- read.csv("./2-data/BORIS_output.csv")

#reading in the decoder
Video_codes <- read.csv("./2-data/Video_codes.csv")

#reading in shrimp species information
shrimp_species <- read.csv("./2-data/species.csv")

#binding the decoder to the BORIS output and revealing the treatment and stage
BORIS_output$code <- str_sub(BORIS_output$video_id, 2,)
BORIS_output$code <- as.factor(BORIS_output$code)
shrimp_species$code <- as.factor(shrimp_species$code)
Video_codes$code <- as.factor(Video_codes$code)
decoded_dataframe <- inner_join(inner_join(BORIS_output, Video_codes, by = c("code")), shrimp_species, by = c("code"))

1.3 Cross-checking the imported datasets

# Find common codes across all data sets
common_codes <- Reduce(intersect, list(BORIS_output$code, shrimp_species$code, Video_codes$code))

# Combine all codes from the three data sets
all_codes <- unique(c(BORIS_output$code, shrimp_species$code, Video_codes$code))

# Find codes not common across all data sets
codes_not_common <- setdiff(all_codes, common_codes)

# Define a function to check which data sets contain each code
check_code_origin <- function(code) {
  origins <- c()

  if(code %in% BORIS_output$code) {
    origins <- c(origins, "BORIS_output")
  }
  if(code %in% shrimp_species$code) {
    origins <- c(origins, "shrimp_species")
  }
  if(code %in% Video_codes$code) {
    origins <- c(origins, "Video_codes")
  }

  return(paste(origins, collapse=", "))
}

# Create a dataframe to store the results
results <- data.frame(code = character(0), origin = character(0), stringsAsFactors = FALSE)

# Loop through each code not common across all data sets
for(code in codes_not_common) {
  origin <- check_code_origin(code)
  results <- rbind(results, data.frame(code = as.character(code), origin = origin, stringsAsFactors = FALSE))
}

# Print the results
print(results)
##    code      origin
## 1    31 Video_codes
## 2    32 Video_codes
## 3    33 Video_codes
## 4    34 Video_codes
## 5    35 Video_codes
## 6    36 Video_codes
## 7    40 Video_codes
## 8    41 Video_codes
## 9    42 Video_codes
## 10  148 Video_codes
## 11  149 Video_codes
## 12  150 Video_codes
# Missing observations are identified exclusively within the 'Video_codes' dataframe. This situation suggests that all videos capturing both shrimp and gobies are consistently represented across the datasets. However, there were instances where burrows were recorded and assigned video codes but showed no activity from gobies or shrimp during these recordings. These instances led to the assumption that such burrows were inactive, resulting in their exclusion from the further analysis of the study.

##1.4 Cleaning the dataframe ###1.4.1 Column renaming

decoded_dataframe <- decoded_dataframe |> 
  rename(shrimp_species = species)

#renaming some of the variables and extracting individual variables from columns that have multiple variables contained in one string
decoded_dataframe <- decoded_dataframe |> 
  dplyr::rename(stage = video_section,
                duration = total_duration_s,
                behaviour = behavior) |>
  dplyr::mutate(date = str_sub(date_file, , 6),
                species = str_sub(subject, 5,),
                duration = as.numeric(duration),
                boat_id = str_sub(date_file, -1, -1),
                video_num = as.numeric(str_sub(video_id, 2)),
                burrow = ceiling(video_num/3),
                individual = str_sub(subject, 1, 1),
                stroke = factor(stroke),
                boat_name = factor(boat_name)
                )

#creating some unique identifiers to make grouping easier later on for reorganising of the dataframe
decoded_dataframe <- decoded_dataframe |> 
  unite("unique_id", 'burrow','individual', 'species', 'stage', remove = FALSE) |> 
  unite("burrow_species_stage", 'burrow', 'species', 'stage', remove = FALSE) |> 
  unite("burrow_species", 'burrow', 'species', remove = FALSE)

###1.4.2 Removing redundant BORIS entries

#the next few lines of code are to do with the way BORIS outputs data, where there was redundant empty sections due to both species being independently scored in the software. So here we are filtering out the species specific data from the correlating BORIS species observation and then rebinding the data to remove all of the empty artifact entries. 

#extracting just the goby data so that a species variable can be made
goby_dataframe <- decoded_dataframe |> 
  dplyr::filter(species == "Goby") |> 
  dplyr::filter(str_detect(video_id, 'g'))

#extracting just the shrimp data so that a species variable can be made
shrimp_dataframe <- decoded_dataframe |> 
  dplyr::filter(species == "Shrimp")  |>  
  dplyr::filter(str_detect(video_id, 'j'))

#binding the two species specific data frames back together so that there is now no empty 
workingdf1 <- bind_rows(goby_dataframe, shrimp_dataframe) 

#filtering for the behviours of interest to this experiment
workingdf2 <- workingdf1 |> 
  group_by(unique_id) |> 
  dplyr::filter(behaviour == 'INSIDE' | behaviour == 'EDGE' | behaviour == 'NEAR' | behaviour == 'AWAY' |behaviour == 'CONTACT' |behaviour == 'APART' ) |>
  mutate(averageduration = sum(duration))

#becuase of the way BORIS outputs data there are redundant individuals in the data, e.g., even if there are only two shrimp in a burrow then BORIS will still output observations for a third shrimp and all value will be 0's. this is what this section of code is removing
workingdf3 <- workingdf2 |> 
  group_by(burrow, species, individual) |> 
  dplyr::filter(sum(averageduration) != 0)

###1.4.3 Assigning values to missing entries

#now here we are making the assumption that when a goby or shrimp is present in other videos but missing from the video of focus it is either away and out of frame for the entire trial if it is a goby. Otherwise it is inside the burrow the entire time if it is a shrimp. These assumptions are based off of preliminary observation and the general tendencies of each species. Because of this assumption we are assigning the respective value to the behviour in cases where one of the species is known to be present in a burrow but not viewed for the length of the trial. 
fixeddf1 <- workingdf3 |> 
  dplyr::filter(averageduration == 0) |> 
  mutate(duration = ifelse(species == "Goby" & behaviour == "AWAY", 300, duration),
         duration = ifelse(species == "Shrimp" & behaviour == "INSIDE", 300, duration)
         )

fixeddf2 <- workingdf3 |> 
  dplyr::filter(averageduration != 0)

workingdf4 <- rbind(fixeddf2, fixeddf1) |> 
  group_by(burrow_species) |> 
  dplyr::mutate(number_conspecifics = max(as.integer(individual))) |> 
  ungroup()

#now using the number of conspecifics to calculate a duration value that represents the mean time spent doing that activity for that species (i.e. goby or shrimp) in that burrow as we are un able to preserve identity and thus instead must look at species averages for each behaviour. 
workingdf5 <- workingdf4 |> 
  group_by(burrow_species, behaviour, stage) |> 
  dplyr::mutate(mean_duration = mean(duration)) |> 
  ungroup() |> 
  dplyr::filter(individual == 1) 

#transforming the data frame into wide format and turning time spent in each zone into a proportion of the total time (i.e. a value between 0 and 1)
wide_data <- workingdf5 |>
  pivot_wider(
    id_cols = c(burrow_species, burrow_species_stage, burrow, stage, species, boat_id, stroke, site, number_conspecifics, shrimp_species),
    names_from = behaviour,
    values_from = mean_duration
  )

wide_data <- wide_data |> 
  mutate(INSIDE = as.numeric(INSIDE),
         EDGE = as.numeric(EDGE),
         NEAR = as.numeric(NEAR),
         AWAY = as.numeric(AWAY),
         CONTACT = as.numeric(CONTACT),
         APART = as.numeric(APART)) |> 
  mutate(total = INSIDE+NEAR+EDGE+AWAY,
         inside = (INSIDE + EDGE)/(INSIDE+EDGE+NEAR+AWAY), 
         away = (NEAR + AWAY)/(INSIDE+EDGE+NEAR+AWAY),
         number_conspecifics = as.factor(number_conspecifics),
         shrimp_contact = CONTACT/(CONTACT+APART)
         ) |> 
  dplyr::select(-INSIDE, -EDGE, -NEAR, -AWAY, -CONTACT, -APART)

#checking if every burrow contains observations for both 'Shrimp' and 'Goby'
burrow_values <- unique(wide_data$burrow) 
has_shrimp <- burrow_values %in% wide_data$burrow[wide_data$species == 'Shrimp'] 
has_goby <- burrow_values %in% wide_data$burrow[wide_data$species == 'Goby'] 
burrows_without_both_species <- burrow_values[!(has_shrimp & has_goby)]
cat("burrows without both 'Shrimp' and 'Goby' species:", paste(burrows_without_both_species, collapse = ', '))
## burrows without both 'Shrimp' and 'Goby' species: 46, 126, 145, 59, 99, 22, 24, 32
#removing the rows with burrows without both 'Shrimp' and 'Goby' species from the dataframe
wide_data <- wide_data[!wide_data$burrow %in% burrows_without_both_species, ]

wide_data <- wide_data |> 
  mutate(burrow = as.factor(burrow))

#Checking to see the count of observations per burrow
burrow_counts <- table(wide_data$burrow)
print(burrow_counts)
## 
##   1   2   3   4   5   6   7   8   9  10  13  15  16  17  18  19  20  21  23  25 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   5   6 
##  26  27  28  29  30  31  33  34  35  36  37  38  39  40  42  44  47  48  49  51 
##   6   6   6   6   6   6   5   6   6   6   6   6   6   6   6   6   6   6   6   6 
##  52  53  54  55  56  57  58  60  61  62  63  64  65  66  67  68  69  70  71  72 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
##  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
##  93  94  95  96  97  98 100 101 102 103 104 105 106 107 109 110 111 113 114 115 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
## 116 117 118 119 121 122 123 124 125 127 129 130 131 132 133 134 135 136 137 138 
##   6   6   6   5   6   6   6   6   6   6   6   6   6   6   4   6   6   6   6   6 
## 139 140 141 142 143 144 
##   6   6   5   6   6   6
#there are some burrows that are missing stages due to the animal not being observered at all during that observation so we will make some conditional assumptions and fill in the missing values. 

#a function to fill the missing stages for each species within each burrow
fill_missing_stages <- function(df) {
  all_stages <- c('Pre', 'During', 'Post')
  
  missing_stages <- setdiff(all_stages, unique(df$stage))
  
  if(length(missing_stages) == 0) return(data.frame())
  
  common_values <- df[1, ]
  
  new_rows <- data.frame()
  
  for(stage in missing_stages) {
    new_row <- common_values
    new_row$stage <- stage
    
    # Set column values based on species
    if(new_row$species == "Goby") {
      new_row$away <- 1
      new_row$inside <- 0
      new_row$total <- 300
      new_row$shrimp_contact <- 0
    } else if(new_row$species == "Shrimp") {
      new_row$away <- 0
      new_row$inside <- 1
      new_row$total <- 300
      new_row$shrimp_contact <- NA
    }
    
    new_rows <- rbind(new_rows, new_row)
  }
  
  return(new_rows)
}

#applying the function
fixeddf3 <- wide_data |>
  group_by(burrow_species) |>
  do(fill_missing_stages(.)) |>
  ungroup()

wide_data_filled <- rbind(wide_data, fixeddf3)
  
#Checking to see the count of observations per burrow
filled_burrow_counts <- table(wide_data_filled$burrow)
print(filled_burrow_counts)
## 
##   1   2   3   4   5   6   7   8   9  10  13  15  16  17  18  19  20  21  23  25 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
##  26  27  28  29  30  31  33  34  35  36  37  38  39  40  42  44  47  48  49  51 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
##  52  53  54  55  56  57  58  60  61  62  63  64  65  66  67  68  69  70  71  72 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
##  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
##  93  94  95  96  97  98 100 101 102 103 104 105 106 107 109 110 111 113 114 115 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
## 116 117 118 119 121 122 123 124 125 127 129 130 131 132 133 134 135 136 137 138 
##   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6 
## 139 140 141 142 143 144 
##   6   6   6   6   6   6

###1.4.4 Changing dataframe format

workingdf7 <- wide_data_filled |> 
  mutate(burrow_stage = paste(burrow, stage))

goby_df <- workingdf7 |> 
  dplyr::filter(species == "Goby") |> 
  rename(goby_out = away, goby_total = total, goby_number = number_conspecifics) |> 
  select(-c("inside", "species", "burrow_species", "burrow_species_stage", "shrimp_contact"))

shrimp_df <- workingdf7 |> 
  dplyr::filter(species == "Shrimp") |> 
  rename(shrimp_out = away, shrimp_total = total, shrimp_number = number_conspecifics) |> 
  select(c("shrimp_out", "shrimp_total", "shrimp_number", "burrow_stage", "shrimp_contact"))

final_df <- inner_join(goby_df, shrimp_df, by = "burrow_stage") |> 
  mutate(shrimp_contact = ifelse(is.na(shrimp_contact), ifelse(goby_out == 1, 0, 1 - goby_out), shrimp_contact)) |> 
  filter(site != "SITE O")

write_csv(final_df, "./2-data/final_df.csv")

#2. Statistical analysis using zero-one inflated beta regression ##2.1 Building a global model

#building a global model for the proportion of time gobies spent out of the burrow
zoib_formula <- bf(
  # mu (mean) part
  goby_out ~ stroke * stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # phi (precision) part
  phi ~ stroke * stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # alpha (zero-one-inflation) part
  zoi ~ stroke * stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # The one-inflated part, conditional on the 0s
  coi ~ stroke * stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  
  family = zero_one_inflated_beta()
)

##2.2 Specifying priors ###2.2.1 Checking default priors

get_prior(
  zoib_formula,
  data = final_df
)
##                 prior     class                      coef       group resp dpar
##                (flat)         b                                                
##                (flat)         b              goby_number2                      
##                (flat)         b            shrimp_number2                      
##                (flat)         b            shrimp_number3                      
##                (flat)         b shrimp_speciesmannarensis                      
##                (flat)         b     shrimp_speciessciolii                      
##                (flat)         b     shrimp_speciesunknown                      
##                (flat)         b                 stagePost                      
##                (flat)         b                  stagePre                      
##                (flat)         b                   stroke4                      
##                (flat)         b         stroke4:stagePost                      
##                (flat)         b          stroke4:stagePre                      
##                (flat)         b             strokecontrol                      
##                (flat)         b   strokecontrol:stagePost                      
##                (flat)         b    strokecontrol:stagePre                      
##  student_t(3, 0, 2.5) Intercept                                                
##  student_t(3, 0, 2.5)        sd                                                
##  student_t(3, 0, 2.5)        sd                                  site          
##  student_t(3, 0, 2.5)        sd                 Intercept        site          
##  student_t(3, 0, 2.5)        sd                           site:burrow          
##  student_t(3, 0, 2.5)        sd                 Intercept site:burrow          
##                (flat)         b                                             coi
##                (flat)         b              goby_number2                   coi
##                (flat)         b            shrimp_number2                   coi
##                (flat)         b            shrimp_number3                   coi
##                (flat)         b shrimp_speciesmannarensis                   coi
##                (flat)         b     shrimp_speciessciolii                   coi
##                (flat)         b     shrimp_speciesunknown                   coi
##                (flat)         b                 stagePost                   coi
##                (flat)         b                  stagePre                   coi
##                (flat)         b                   stroke4                   coi
##                (flat)         b         stroke4:stagePost                   coi
##                (flat)         b          stroke4:stagePre                   coi
##                (flat)         b             strokecontrol                   coi
##                (flat)         b   strokecontrol:stagePost                   coi
##                (flat)         b    strokecontrol:stagePre                   coi
##        logistic(0, 1) Intercept                                             coi
##  student_t(3, 0, 2.5)        sd                                             coi
##  student_t(3, 0, 2.5)        sd                                  site       coi
##  student_t(3, 0, 2.5)        sd                 Intercept        site       coi
##  student_t(3, 0, 2.5)        sd                           site:burrow       coi
##  student_t(3, 0, 2.5)        sd                 Intercept site:burrow       coi
##                (flat)         b                                             phi
##                (flat)         b              goby_number2                   phi
##                (flat)         b            shrimp_number2                   phi
##                (flat)         b            shrimp_number3                   phi
##                (flat)         b shrimp_speciesmannarensis                   phi
##                (flat)         b     shrimp_speciessciolii                   phi
##                (flat)         b     shrimp_speciesunknown                   phi
##                (flat)         b                 stagePost                   phi
##                (flat)         b                  stagePre                   phi
##                (flat)         b                   stroke4                   phi
##                (flat)         b         stroke4:stagePost                   phi
##                (flat)         b          stroke4:stagePre                   phi
##                (flat)         b             strokecontrol                   phi
##                (flat)         b   strokecontrol:stagePost                   phi
##                (flat)         b    strokecontrol:stagePre                   phi
##  student_t(3, 0, 2.5) Intercept                                             phi
##  student_t(3, 0, 2.5)        sd                                             phi
##  student_t(3, 0, 2.5)        sd                                  site       phi
##  student_t(3, 0, 2.5)        sd                 Intercept        site       phi
##  student_t(3, 0, 2.5)        sd                           site:burrow       phi
##  student_t(3, 0, 2.5)        sd                 Intercept site:burrow       phi
##                (flat)         b                                             zoi
##                (flat)         b              goby_number2                   zoi
##                (flat)         b            shrimp_number2                   zoi
##                (flat)         b            shrimp_number3                   zoi
##                (flat)         b shrimp_speciesmannarensis                   zoi
##                (flat)         b     shrimp_speciessciolii                   zoi
##                (flat)         b     shrimp_speciesunknown                   zoi
##                (flat)         b                 stagePost                   zoi
##                (flat)         b                  stagePre                   zoi
##                (flat)         b                   stroke4                   zoi
##                (flat)         b         stroke4:stagePost                   zoi
##                (flat)         b          stroke4:stagePre                   zoi
##                (flat)         b             strokecontrol                   zoi
##                (flat)         b   strokecontrol:stagePost                   zoi
##                (flat)         b    strokecontrol:stagePre                   zoi
##        logistic(0, 1) Intercept                                             zoi
##  student_t(3, 0, 2.5)        sd                                             zoi
##  student_t(3, 0, 2.5)        sd                                  site       zoi
##  student_t(3, 0, 2.5)        sd                 Intercept        site       zoi
##  student_t(3, 0, 2.5)        sd                           site:burrow       zoi
##  student_t(3, 0, 2.5)        sd                 Intercept site:burrow       zoi
##  nlpar lb ub       source
##                   default
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##                   default
##         0         default
##         0    (vectorized)
##         0    (vectorized)
##         0    (vectorized)
##         0    (vectorized)
##                   default
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##                   default
##         0         default
##         0    (vectorized)
##         0    (vectorized)
##         0    (vectorized)
##         0    (vectorized)
##                   default
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##                   default
##         0         default
##         0    (vectorized)
##         0    (vectorized)
##         0    (vectorized)
##         0    (vectorized)
##                   default
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##              (vectorized)
##                   default
##         0         default
##         0    (vectorized)
##         0    (vectorized)
##         0    (vectorized)
##         0    (vectorized)
#we can see that all the beta coefficients are being given a flat prior which means it can take on a value from - infinity to + infinity. All the beta coefficients are on the logit scale so lets plot how changing the value of beta relates to different proportions

###2.2.2 Graphing logit~proportion

tibble(x = seq(-8, 8, by = 0.1)) |> 
  mutate(y = plogis(x)) |> 
  ggplot(aes(x = x, y = y)) +
  geom_line(size = 1) +
  labs(x = "Logit scale", y = "Probability scale")

#we can see that after -5 or +5 the probability doesn't change much, instead of leaving our priors at the default of + and - infinity, we should say that they are most likely to occur between -5 and +5.

###2.2.3 Ploting priors

# Generate data points
x <- seq(-20, 20, length.out = 1000)  # Adjusted range for better visualization

# Define parameters for the distributions
loc_logistic <- 0
scale_logistic <- 3

df_student_t <- 3
loc_student_t <- 0
scale_student_t <- 2.5

loc_normal <- 0
scale_normal <- 3

# Calculate PDFs
pdf_logistic <- dlogis(x, location = loc_logistic, scale = scale_logistic)
pdf_student_t <- dt(x, df = df_student_t)
pdf_normal <- dnorm(x, mean = loc_normal, sd = scale_normal)

# Plot the PDFs
df <- data.frame(x = x, Logistic = pdf_logistic, Student_t = pdf_student_t, Normal = pdf_normal)
ggplot(df, aes(x)) +
  geom_line(aes(y = Logistic, color = "Logistic(0, 3)")) + # Default priors of Logistic(0,1) have been broadened as these priors seemed too restrictive
  geom_line(aes(y = Student_t, color = "Student_t(3, 0, 2.5)")) +
  geom_line(aes(y = Normal, color = "Normal(0, 3)")) + #For the beta coefficient prior, we will set it to be normally distributed around 0 with an sd of 5, here is the plotted prior distribution 
  labs(title = "Probability Density Functions",
       x = "x",
       y = "Probability Density") +
  scale_color_manual(name = "Distribution", values = c("Logistic(0, 3)" = "blue", "Student_t(3, 0, 2.5)" = "green", "Normal(0, 3)" = "red")) +
  theme_minimal()

###2.2.4 Setting priors

#the priors for the intercept have been left as the default and the coefficient priors defined above
priors <- c(set_prior("student_t(3, 0, 2.5)", class = "Intercept"),
            set_prior("logistic(0, 3)", class = "Intercept", dpar = "coi"),
            set_prior("logistic(0, 3)", class = "Intercept", dpar = "zoi"),
            set_prior("student_t(3, 0, 2.5)", class = "Intercept", dpar = "phi", lb = 0),
            set_prior("student_t(3, 0, 2.5)", class = "sd", lb = 0),
            set_prior("student_t(3, 0, 2.5)", class = "sd", dpar = "phi", lb = 0),
            set_prior("student_t(3, 0, 2.5)", class = "sd", dpar = "zoi", lb = 0),
            set_prior("student_t(3, 0, 2.5)", class = "sd", dpar = "coi", lb = 0),
            set_prior("normal(0, 3)", class = "b"),
            set_prior("normal(0, 3)", class = "b", dpar = "phi"),
            set_prior("normal(0, 3)", class = "b", dpar = "zoi"),
            set_prior("normal(0, 3)", class = "b", dpar = "coi"))

###2.2.5 Prior predictive check

prior_formula <- bf(
  # mu (mean) part
  goby_out ~ stroke*stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # phi (precision) part
  phi ~ stroke*stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # alpha (zero-one-inflation) part
  zoi ~ stroke*stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # The one-inflated part, conditional on the 0s
  coi ~ stroke*stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  
  family = zero_one_inflated_beta()
)

prior_model <- brm(
  prior_formula,
  data = final_df,
  family = zero_one_inflated_beta(),
  prior = priors,
  control = list(adapt_delta = 0.99,
                 max_treedepth = 12),
  chains = 4, iter = 1000, warmup = 100,
  cores = 4, threads = threading(2),
  backend = "cmdstanr",
  seed = 1,
  sample_prior = "only",
  file = "prior_check"
)

pp_check(prior_model, ndraws=20)

pp_check(prior_model, ndraws=100, type = 'stat', stat = 'mean')

##2.3 Modelling the proportion of time gobies spent outside of the burrow

goby_out_formula_1 <- bf(
  # mu (mean) part
  goby_out ~ stroke*stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # phi (precision) part
  phi ~ stroke*stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # alpha (zero-one-inflation) part
  zoi ~ stroke*stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  # The one-inflated part, conditional on the 0s
  coi ~ stroke*stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow),
  
  family = zero_one_inflated_beta()
)

goby_out_model <- brm(
  goby_out_formula_1,
  data = final_df,
  family = zero_one_inflated_beta(),
  prior = priors,
  control = list(adapt_delta = 0.99,
                 max_treedepth = 12),
  chains = 4, iter = 4000, warmup = 1000,
  cores = 4, threads = threading(2),
  backend = "cmdstanr",
  seed = 1,
  file = "goby_out_model"
)

summary(goby_out_model)
##  Family: zero_one_inflated_beta 
##   Links: mu = logit; phi = log; zoi = logit; coi = logit 
## Formula: goby_out ~ stroke * stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow) 
##          phi ~ stroke * stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow)
##          zoi ~ stroke * stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow)
##          coi ~ stroke * stage + goby_number + shrimp_number + shrimp_species + (1 | site/burrow)
##    Data: final_df (Number of observations: 369) 
##   Draws: 4 chains, each with iter = 4000; warmup = 1000; thin = 1;
##          total post-warmup draws = 12000
## 
## Multilevel Hyperparameters:
## ~site (Number of levels: 5) 
##                   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)         0.20      0.21     0.01     0.76 1.00     3055     5294
## sd(phi_Intercept)     0.28      0.26     0.01     0.96 1.00     2782     4846
## sd(zoi_Intercept)     0.84      0.60     0.06     2.39 1.00     2557     2582
## sd(coi_Intercept)     1.82      1.70     0.07     6.09 1.00     6696     6013
## 
## ~site:burrow (Number of levels: 123) 
##                   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)         0.95      0.12     0.72     1.21 1.00     2977     5088
## sd(phi_Intercept)     0.18      0.13     0.01     0.49 1.00     2547     4278
## sd(zoi_Intercept)     1.75      0.38     1.07     2.55 1.00     3256     5519
## sd(coi_Intercept)    14.94      8.83     5.25    37.23 1.00     4059     6542
## 
## Regression Coefficients:
##                               Estimate Est.Error l-95% CI u-95% CI Rhat
## Intercept                        -0.56      0.58    -1.70     0.58 1.00
## phi_Intercept                     0.54      0.56    -0.60     1.61 1.00
## zoi_Intercept                    -4.65      1.52    -7.77    -1.80 1.00
## coi_Intercept                     3.63      4.52    -4.69    13.29 1.00
## stroke4                          -0.43      0.34    -1.09     0.23 1.00
## strokecontrol                     0.25      0.33    -0.41     0.90 1.00
## stagePost                        -0.04      0.23    -0.49     0.40 1.00
## stagePre                          0.31      0.23    -0.14     0.76 1.00
## goby_number2                      0.76      0.27     0.23     1.29 1.00
## shrimp_number2                    0.69      0.28     0.14     1.25 1.00
## shrimp_number3                    0.38      0.84    -1.30     2.05 1.00
## shrimp_speciesmannarensis         0.41      0.50    -0.58     1.37 1.00
## shrimp_speciessciolii             0.31      0.69    -1.06     1.68 1.00
## shrimp_speciesunknown             0.47      0.55    -0.60     1.54 1.00
## stroke4:stagePost                 0.37      0.36    -0.36     1.07 1.00
## strokecontrol:stagePost           0.11      0.38    -0.64     0.86 1.00
## stroke4:stagePre                  0.49      0.37    -0.25     1.22 1.00
## strokecontrol:stagePre           -0.60      0.36    -1.31     0.11 1.00
## phi_stroke4                      -0.75      0.38    -1.50    -0.01 1.00
## phi_strokecontrol                -0.13      0.43    -0.97     0.71 1.00
## phi_stagePost                    -0.40      0.36    -1.13     0.30 1.00
## phi_stagePre                     -0.22      0.37    -0.96     0.48 1.00
## phi_goby_number2                  0.97      0.27     0.45     1.49 1.00
## phi_shrimp_number2                0.22      0.25    -0.26     0.73 1.00
## phi_shrimp_number3               -0.16      0.72    -1.55     1.25 1.00
## phi_shrimp_speciesmannarensis     0.58      0.42    -0.21     1.46 1.00
## phi_shrimp_speciessciolii         0.20      0.55    -0.87     1.30 1.00
## phi_shrimp_speciesunknown         0.49      0.48    -0.42     1.46 1.00
## phi_stroke4:stagePost             0.63      0.51    -0.35     1.62 1.00
## phi_strokecontrol:stagePost       0.08      0.56    -1.00     1.16 1.00
## phi_stroke4:stagePre              0.53      0.54    -0.53     1.57 1.00
## phi_strokecontrol:stagePre       -0.06      0.57    -1.17     1.06 1.00
## zoi_stroke4                       0.20      0.83    -1.42     1.84 1.00
## zoi_strokecontrol                 1.54      0.77     0.08     3.09 1.00
## zoi_stagePost                    -0.03      0.67    -1.33     1.27 1.00
## zoi_stagePre                      0.99      0.63    -0.23     2.25 1.00
## zoi_goby_number2                 -1.57      0.71    -3.05    -0.23 1.00
## zoi_shrimp_number2                0.02      0.61    -1.17     1.24 1.00
## zoi_shrimp_number3                0.44      1.50    -2.57     3.33 1.00
## zoi_shrimp_speciesmannarensis     1.89      1.29    -0.55     4.56 1.00
## zoi_shrimp_speciessciolii         1.97      1.47    -0.87     4.90 1.00
## zoi_shrimp_speciesunknown         2.28      1.34    -0.26     4.99 1.00
## zoi_stroke4:stagePost             1.28      0.94    -0.53     3.15 1.00
## zoi_strokecontrol:stagePost       0.45      0.88    -1.27     2.20 1.00
## zoi_stroke4:stagePre             -0.41      0.93    -2.24     1.43 1.00
## zoi_strokecontrol:stagePre       -1.13      0.87    -2.83     0.55 1.00
## coi_stroke4                      -0.97      2.58    -5.87     4.22 1.00
## coi_strokecontrol                -0.64      2.62    -5.62     4.77 1.00
## coi_stagePost                     0.59      2.02    -3.27     4.74 1.00
## coi_stagePre                     -1.34      2.01    -5.50     2.44 1.00
## coi_goby_number2                  1.87      2.89    -3.88     7.46 1.00
## coi_shrimp_number2                1.88      2.65    -3.43     6.98 1.00
## coi_shrimp_number3                0.58      2.93    -5.23     6.29 1.00
## coi_shrimp_speciesmannarensis    -0.18      2.61    -5.22     5.00 1.00
## coi_shrimp_speciessciolii         0.11      2.84    -5.52     5.63 1.00
## coi_shrimp_speciesunknown         0.16      2.67    -5.09     5.36 1.00
## coi_stroke4:stagePost            -0.67      2.64    -5.78     4.52 1.00
## coi_strokecontrol:stagePost       0.07      2.52    -4.94     5.10 1.00
## coi_stroke4:stagePre              0.60      2.68    -4.63     5.80 1.00
## coi_strokecontrol:stagePre       -0.34      2.55    -5.34     4.75 1.00
##                               Bulk_ESS Tail_ESS
## Intercept                         3817     6057
## phi_Intercept                     3954     5442
## zoi_Intercept                     4911     6500
## coi_Intercept                     7410     7550
## stroke4                           4145     6511
## strokecontrol                     4019     6210
## stagePost                         5396     7566
## stagePre                          5218     7587
## goby_number2                      3788     6321
## shrimp_number2                    3977     6505
## shrimp_number3                    6113     7672
## shrimp_speciesmannarensis         3627     5992
## shrimp_speciessciolii             4123     6904
## shrimp_speciesunknown             3833     6301
## stroke4:stagePost                 5684     7467
## strokecontrol:stagePost           5607     7906
## stroke4:stagePre                  5496     7223
## strokecontrol:stagePre            5464     7712
## phi_stroke4                       3952     5841
## phi_strokecontrol                 3759     5665
## phi_stagePost                     3835     5937
## phi_stagePre                      4177     6664
## phi_goby_number2                  7361     8798
## phi_shrimp_number2                7372     8376
## phi_shrimp_number3                8680     8719
## phi_shrimp_speciesmannarensis     4476     6512
## phi_shrimp_speciessciolii         5578     7638
## phi_shrimp_speciesunknown         4466     6560
## phi_stroke4:stagePost             4803     6699
## phi_strokecontrol:stagePost       4285     6916
## phi_stroke4:stagePre              4726     6846
## phi_strokecontrol:stagePre        4172     6623
## zoi_stroke4                       4669     7059
## zoi_strokecontrol                 4447     6447
## zoi_stagePost                     4595     7525
## zoi_stagePre                      5029     7451
## zoi_goby_number2                  6448     7257
## zoi_shrimp_number2                5830     7445
## zoi_shrimp_number3                8548     9025
## zoi_shrimp_speciesmannarensis     5219     6637
## zoi_shrimp_speciessciolii         5589     7427
## zoi_shrimp_speciesunknown         5358     7012
## zoi_stroke4:stagePost             5029     7911
## zoi_strokecontrol:stagePost       5072     7101
## zoi_stroke4:stagePre              5527     8009
## zoi_strokecontrol:stagePre        5585     7375
## coi_stroke4                       9982     8939
## coi_strokecontrol                 8616     8392
## coi_stagePost                     9837     8241
## coi_stagePre                      9290     8901
## coi_goby_number2                  9040     8784
## coi_shrimp_number2                8762     8986
## coi_shrimp_number3               13937     8873
## coi_shrimp_speciesmannarensis    11322     9704
## coi_shrimp_speciessciolii        14206     9008
## coi_shrimp_speciesunknown        10515     9219
## coi_stroke4:stagePost            11886     9584
## coi_strokecontrol:stagePost      11208     9021
## coi_stroke4:stagePre             12132     8898
## coi_strokecontrol:stagePre       12755     8356
## 
## Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

###2.3.1 Model fit and diagnostics ####2.3.1.1 Model convergence

#convergence diagnostics (R-hat)
extract_rhats <- function(model) {
  model_summary <- summary(model)
  #extract R-hat values for fixed effects
  fixed_rhats <- model_summary$fixed[, "Rhat", drop = FALSE]
  #check for random effects and extract R-hat values if present
  if (!is.null(model_summary$random)) {
    random_rhats <- do.call(rbind, lapply(model_summary$random, function(x) x[, "Rhat", drop = FALSE]))
    #combine fixed and random effects R-hat values
    rhats <- rbind(fixed_rhats, random_rhats)
  } else {
    rhats <- fixed_rhats
  }
  
  return(rhats)
}

extract_rhats(goby_out_model)
##                                    Rhat
## Intercept                     1.0005578
## phi_Intercept                 1.0009595
## zoi_Intercept                 0.9999930
## coi_Intercept                 1.0002505
## stroke4                       1.0002134
## strokecontrol                 1.0000376
## stagePost                     1.0007459
## stagePre                      1.0012678
## goby_number2                  1.0002532
## shrimp_number2                1.0010880
## shrimp_number3                1.0006650
## shrimp_speciesmannarensis     1.0013751
## shrimp_speciessciolii         1.0010367
## shrimp_speciesunknown         1.0011741
## stroke4:stagePost             1.0006817
## strokecontrol:stagePost       1.0003990
## stroke4:stagePre              1.0006277
## strokecontrol:stagePre        1.0008589
## phi_stroke4                   1.0005548
## phi_strokecontrol             1.0000521
## phi_stagePost                 1.0003700
## phi_stagePre                  1.0011527
## phi_goby_number2              1.0005467
## phi_shrimp_number2            1.0001211
## phi_shrimp_number3            0.9999848
## phi_shrimp_speciesmannarensis 1.0010171
## phi_shrimp_speciessciolii     1.0007876
## phi_shrimp_speciesunknown     1.0005111
## phi_stroke4:stagePost         1.0005792
## phi_strokecontrol:stagePost   0.9999932
## phi_stroke4:stagePre          1.0002913
## phi_strokecontrol:stagePre    1.0001436
## zoi_stroke4                   1.0003714
## zoi_strokecontrol             1.0010740
## zoi_stagePost                 1.0000282
## zoi_stagePre                  1.0004724
## zoi_goby_number2              1.0006268
## zoi_shrimp_number2            1.0000590
## zoi_shrimp_number3            1.0000891
## zoi_shrimp_speciesmannarensis 1.0005980
## zoi_shrimp_speciessciolii     1.0006451
## zoi_shrimp_speciesunknown     1.0004113
## zoi_stroke4:stagePost         0.9999697
## zoi_strokecontrol:stagePost   1.0002877
## zoi_stroke4:stagePre          1.0006642
## zoi_strokecontrol:stagePre    1.0003515
## coi_stroke4                   1.0001140
## coi_strokecontrol             1.0001493
## coi_stagePost                 1.0001532
## coi_stagePre                  1.0002669
## coi_goby_number2              1.0007911
## coi_shrimp_number2            1.0003449
## coi_shrimp_number3            1.0000471
## coi_shrimp_speciesmannarensis 1.0001202
## coi_shrimp_speciessciolii     0.9999673
## coi_shrimp_speciesunknown     1.0002196
## coi_stroke4:stagePost         1.0000630
## coi_strokecontrol:stagePost   1.0000740
## coi_stroke4:stagePre          1.0005086
## coi_strokecontrol:stagePre    1.0002274
## site.sd(Intercept)            1.0011060
## site.sd(phi_Intercept)        1.0006338
## site.sd(zoi_Intercept)        1.0006809
## site.sd(coi_Intercept)        1.0006903
## site:burrow.sd(Intercept)     1.0000363
## site:burrow.sd(phi_Intercept) 1.0007214
## site:burrow.sd(zoi_Intercept) 1.0010080
## site:burrow.sd(coi_Intercept) 1.0009396

####2.3.1.2 Model fit

#posterior predictive checks
pp_check(goby_out_model, ndraws = 50)

pp_check(goby_out_model, type='stat', stat='mean')

#fitted vs predicted values
summary(fitted(goby_out_model))
##     Estimate        Est.Error            Q2.5              Q97.5       
##  Min.   :0.1588   Min.   :0.04909   Min.   :0.007135   Min.   :0.4130  
##  1st Qu.:0.4984   1st Qu.:0.10560   1st Qu.:0.213903   1st Qu.:0.7719  
##  Median :0.6774   Median :0.12828   Median :0.379441   Median :0.8931  
##  Mean   :0.6297   Mean   :0.12544   Mean   :0.367441   Mean   :0.8473  
##  3rd Qu.:0.7918   3rd Qu.:0.14591   3rd Qu.:0.516355   3rd Qu.:0.9451  
##  Max.   :0.9326   Max.   :0.24505   Max.   :0.803405   Max.   :0.9987
summary(predict(goby_out_model))
##     Estimate        Est.Error           Q2.5             Q97.5       
##  Min.   :0.1595   Min.   :0.1284   Min.   :0.00000   Min.   :0.9330  
##  1st Qu.:0.5003   1st Qu.:0.2471   1st Qu.:0.00000   1st Qu.:1.0000  
##  Median :0.6779   Median :0.2965   Median :0.00000   Median :1.0000  
##  Mean   :0.6294   Mean   :0.2854   Mean   :0.06544   Mean   :0.9992  
##  3rd Qu.:0.7922   3rd Qu.:0.3295   3rd Qu.:0.04008   3rd Qu.:1.0000  
##  Max.   :0.9328   Max.   :0.4557   Max.   :0.57493   Max.   :1.0000

###2.3.2 Posterior marginal effects ####2.3.2.1 Pairwise contrasts of stroke and stage

goby_out_contrast_effect <- goby_out_model |>
  emmeans(~ stroke*stage, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

# Extract the relevant contrast information
goby_out_results.table <- as.data.frame(goby_out_contrast_effect) |> 
  dplyr::filter(contrast %in% c("control Pre - 2 Pre", "control Pre - 4 Pre","4 Pre - 2 Pre", "control Pre - control During", "control Pre - control Post", "4 Pre - 4 During", "4 Pre - 4 Post", "2 Pre - 2 During", "2 Pre - 2 Post"))

goby_out_results.table
##  contrast                        estimate   lower.HPD  upper.HPD
##  2 Pre - 2 During              0.06131526 -0.04085772 0.16578566
##  2 Pre - 2 Post                0.06697584 -0.04508346 0.18552813
##  4 Pre - 4 During              0.15184351  0.01311128 0.28627348
##  4 Pre - 4 Post                0.06674910 -0.08135213 0.22150063
##  4 Pre - 2 Pre                 0.00457735 -0.15864033 0.13777826
##  control Pre - control During -0.06948150 -0.20576921 0.06260540
##  control Pre - control Post   -0.09180295 -0.25366372 0.05686286
##  control Pre - 2 Pre          -0.06730160 -0.22705272 0.08824646
##  control Pre - 4 Pre          -0.07129914 -0.25472546 0.10683535
## 
## Results are averaged over the levels of: goby_number, shrimp_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
goby_out_contrast_draws <- goby_out_model |>
  emmeans(~ stroke*stage, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") |> 
  gather_emmeans_draws()
  goby_out_contrast_draws
## # A tibble: 432,000 × 5
## # Groups:   contrast [36]
##    contrast            .chain .iteration .draw   .value
##    <chr>                <int>      <int> <int>    <dbl>
##  1 4 During - 2 During     NA         NA     1 -0.00820
##  2 4 During - 2 During     NA         NA     2 -0.0491 
##  3 4 During - 2 During     NA         NA     3 -0.0492 
##  4 4 During - 2 During     NA         NA     4 -0.107  
##  5 4 During - 2 During     NA         NA     5 -0.0321 
##  6 4 During - 2 During     NA         NA     6 -0.0724 
##  7 4 During - 2 During     NA         NA     7 -0.138  
##  8 4 During - 2 During     NA         NA     8 -0.0889 
##  9 4 During - 2 During     NA         NA     9 -0.0438 
## 10 4 During - 2 During     NA         NA    10 -0.0502 
## # ℹ 431,990 more rows
goby_out_temporal_contrasts <- goby_out_contrast_draws |> 
  dplyr::filter(contrast %in% c("control Pre - control During", "control Pre - control Post", "4 Pre - 4 During", "4 Pre - 4 Post", "2 Pre - 2 During", "2 Pre - 2 Post")) |> 
  mutate(stroke = ifelse(contrast %in% c("control Pre - control During", "control Pre - control Post"), "Control", ifelse(contrast %in% c("4 Pre - 4 During", "4 Pre - 4 Post"), "4", "2")))

goby_out_temporal_contrasts$stroke <- factor(goby_out_temporal_contrasts$stroke, levels = c("Control", "4", "2"))

fig.goby_out_temporal_contrasts<- ggplot(goby_out_temporal_contrasts, aes(x = .value, y = factor(contrast, levels = c("control Pre - control During", "control Pre - control Post", "4 Pre - 4 During", "4 Pre - 4 Post", "2 Pre - 2 During", "2 Pre - 2 Post")), color = stroke, fill = stroke)) +
   geom_vline(xintercept = 0, color = "black", size = 0.5) +
  stat_halfeye(.width = c(0.89, 0.95))+
  scale_color_manual(values = c(colour11, colour12, colour13)) +
  scale_fill_manual(values = alpha(c(colour1, colour2, colour3), 0.8)) +
  labs(y = "Contrasts of the time periods relative to noise exposure",
       fill = "Noise treatment", color = "Noise treatment",
       fill_ramp = "Credible interval") +
  xlab(NULL) +
  coord_flip() +
  theme(legend.position = "right", 
        axis.text.x = element_text(angle = 50, hjust =1)) +
  scale_y_discrete(labels = c("Pre - During", "Pre - Post", "Pre - During", "Pre - Post", "Pre - During", "Pre - Post")) +
  scale_x_continuous(breaks = seq(-0.4, 0.5, 0.1), labels = c("-0.4","-0.3", "-0.2","-0.1" , "0", "0.1", "0.2", "0.3", "0.4", "0.5"), limits = c(-0.4, 0.4))

fig.goby_out_temporal_contrasts

###2.3.3 Extracting and plotting model estimates ####2.3.3.1 Extracting estimates

goby_out_model_estimates <- goby_out_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA)

goby_out_model_estimates <- as.data.frame(goby_out_model_estimates)

#Storing the model estimate means for each group to plot later on
goby_out_model_estimates_control <- goby_out_model_estimates |> 
  dplyr::filter(stroke == "control") |> 
  rename(.value = emmean)

goby_out_model_estimates_four <- goby_out_model_estimates |> 
  dplyr::filter(stroke == "4")|> 
  rename(.value = emmean)

goby_out_model_estimates_two <- goby_out_model_estimates |> 
  dplyr::filter(stroke == "2")|> 
  rename(.value = emmean)

####2.3.3.2 Plotting model estimates and raw data

goby_out_model_draws <- goby_out_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA) |> 
  gather_emmeans_draws()

goby_out_model_draws <- goby_out_model_draws |> 
  rename(emmean = .value)

goby_out_raw_data <- final_df |> 
  rename(emmean = goby_out)

goby_out_raw_data$stage <- factor(goby_out_raw_data$stage, levels = c("Pre", "During", "Post"))
goby_out_raw_data$stroke <- factor(goby_out_raw_data$stroke, levels = c("control", "4", "2"))

goby_out_model_estimates$stage <- factor(goby_out_model_estimates$stage, levels = c("Pre", "During", "Post"))
goby_out_model_estimates$stroke <- factor(goby_out_model_estimates$stroke, levels = c("control", "4", "2"))

goby_out_model_draws$stage <- factor(goby_out_model_draws$stage, levels = c("Pre", "During", "Post"))
goby_out_model_draws$stroke <- factor(goby_out_model_draws$stroke, levels = c("control", "4", "2"))

goby_out_means <- goby_out_raw_data |> 
  group_by(stage, stroke) |> 
  summarise(emmean = mean(emmean))


goby_out_fig_together <- ggplot(data = goby_out_raw_data, aes(x = stage, y = emmean, color = stroke, fill = stroke)) +
  geom_point(data = goby_out_means, alpha = 1, position = position_dodgenudge(width = 0.8, x = -0.09), size = 9, shape = "_") +
  geom_half_point(alpha = 0.3, position = position_dodgenudge(width = 0.8, x = -0.03), side = "l", range_scale = 0.5) +
  geom_half_violin(data = goby_out_model_draws, aes(x = stage, y = emmean, color = stroke, fill = stroke), alpha = 0.6, position = position_dodge(width = 0.8), side = "r", size = 0) +
  geom_point(data = goby_out_model_estimates, aes(x = stage, y = emmean, color = stroke), position = position_dodge(width = 0.8), size = 3) +
  geom_errorbar(data = goby_out_model_estimates, aes(x = stage, y = emmean, ymin = lower.HPD, ymax = upper.HPD, color = stroke), position = position_dodge(width = 0.8), width = 0, size = 1.25) +
  scale_fill_manual(values = c("control" = "#76A34A", "4" = "#F29E00", "2" = "#E25A00"), name = "Noise exposure", guide = guide_legend(override.aes = list(size = 3))) +
  scale_color_manual(values = c("control" = "#2A330E", "4" = "#805213", "2" = "#542709"), name = "Noise exposure", guide = guide_legend(override.aes = list(size = 3))) +
  scale_x_discrete(labels = c("Pre", "During", "Post")) +
  labs(title = "The effects of boat noise on goby burrow use",
       y = "Proportion of time in out of the burrow",
       x = "Experimental phase relative to noise exposure") +
  theme_classic() +
  theme(
    axis.text.x = element_text(size = 10, margin = margin(t = 5)),  
    axis.text.y = element_text(size = 10, margin = margin(r = 5)),  
    axis.title.x = element_text(size = 13, margin = margin(t = 10)),
    axis.title.y = element_text(size = 13, margin = margin(r = 10)),
    legend.text = element_text(size = 10),
    legend.title = element_text(size = 10),
    legend.position = "right",
    legend.justification = "top",
    plot.title = element_text(hjust = 0.5, size = 16),  
    plot.margin = margin(10, 10, 10, 10)
  )

goby_out_fig_together

####2.3.3.3 Plotting control estimates and raw data

goby_out_model_draws <- goby_out_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA) |> 
  gather_emmeans_draws()

goby_out_raw_data <- final_df |>
  rename(.value = goby_out)

goby_out_model_draws$stage <- factor(goby_out_model_draws$stage, levels = c("Pre", "During", "Post"))
goby_out_model_draws$stroke <- factor(goby_out_model_draws$stroke, levels = c("control", "4", "2"))

goby_out_control_model_draws <- goby_out_model_draws |> 
  dplyr::filter(stroke == "control")

goby_control_raw_data <- final_df |> 
  dplyr::filter(stroke =="control") |> 
  rename(.value = goby_out)

goby_control_means <- goby_control_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

goby_control_raw_data$stage <- factor(goby_control_raw_data$stage, levels = c("Pre", "During", "Post"))

#assigning a value for the baseline mean
goby_out_model_estimates_control_intercept <- goby_out_model_estimates_control %>%
  dplyr::filter(stage == "Pre") %>%
  pull(.value)

goby_out_fig_control <- ggplot(goby_control_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = goby_out_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = goby_out_model_estimates_control, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = goby_out_model_estimates_control, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = goby_control_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  labs(x="Period relative to treatment",
       y="Proportion of time out of burrow") +
  theme(legend.position = "none", 
        axis.title.x = element_blank(), 
        axis.text.x = element_text(size = 13),  
        axis.text.y = element_text(size = 13),
        panel.grid = element_blank(),
        axis.title.y = element_text(size = 16, face = "bold", margin = margin(t = 0, b = 0, l = 0, r = 10)),
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#A3C088", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("Control")+
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#76A34A", "Post" = "#D3D9A7")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#2A330E", "Post" = "#5d634c"))

goby_out_fig_control

####2.3.3.4 Plotting 4-stroke estimates and raw data

goby_out_control_model_draws <- goby_out_model_draws |> 
  dplyr::filter(stroke == "4")

goby_four_raw_data <- final_df |> 
  dplyr::filter(stroke =="4") |> 
  rename(.value = goby_out)

goby_four_raw_data$stage <- factor(goby_four_raw_data$stage, levels = c("Pre", "During", "Post"))

goby_four_means <- goby_four_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

goby_out_fig_four <- ggplot(goby_four_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = goby_out_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = goby_out_model_estimates_four, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = goby_out_model_estimates_four, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = goby_four_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  xlab("Experimental phase relative to noise exposure")+
  theme(legend.position = "none", 
        axis.title.y = element_blank(),  
        axis.text.x = element_text(size = 13),  
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        panel.grid = element_blank(),
        axis.title.x = element_text(size = 16, face = "bold", margin = margin(t = 15, b = 0, l = 0, r = 0)),
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#F6BC65", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("4-stroke")+
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#F29E00", "Post" = "#F2D5A0")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#805213", "Post" = "#70532b"))

goby_out_fig_four

####2.3.3.5 Plotting 2-stroke estimates and raw data

goby_out_control_model_draws <- goby_out_model_draws |> 
  dplyr::filter(stroke == "2")

goby_two_raw_data <- final_df |> 
  dplyr::filter(stroke =="2") |> 
  rename(.value = goby_out)

goby_two_raw_data$stage <- factor(goby_two_raw_data$stage, levels = c("Pre", "During", "Post"))

goby_two_means <- goby_two_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

goby_out_fig_two <- ggplot(goby_two_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = goby_out_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = goby_out_model_estimates_two, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = goby_out_model_estimates_two, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = goby_two_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  theme(legend.position = "none", 
        axis.title.x = element_blank(),  
        axis.text.x = element_text(size = 13),
        axis.title.y = element_blank(), 
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        panel.grid = element_blank(),
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#EB9063", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("2-stroke") +
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#E25A00", "Post" = "#F2B389")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#542709", "Post" = "#66422a"))

goby_out_fig_two

####2.3.3.6 Combining plots into one figure

goby_out_plot3 <- goby_out_fig_control + goby_out_fig_four + goby_out_fig_two + 
  plot_layout(ncol = 3)

goby_out_plot3

ggsave("./3-figs/goby_out_plot3.jpeg", plot = goby_out_plot3, units = "px", width = 2200, height = 1400, dpi = 300)

###2.3.4 Effects of covariates on the proportion of time gobies spent outside of the burrow ####2.3.4.1 Goby number

goby_out_model |>
  emmeans(~ goby_number, 
          epred = TRUE,
          re_formla = NULL)
##  goby_number emmean lower.HPD upper.HPD
##  1            0.575     0.423     0.729
##  2            0.707     0.549     0.842
## 
## Results are averaged over the levels of: stroke, stage, shrimp_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
goby_out_goby_number <- goby_out_model |>
  emmeans(~ goby_number, 
          epred = TRUE,
          re_formla = NULL) |> 
  contrast(method = "revpairwise")

goby_out_goby_number
##  contrast                    estimate lower.HPD upper.HPD
##  goby_number2 - goby_number1    0.128  -0.00135     0.249
## 
## Results are averaged over the levels of: stroke, stage, shrimp_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
goby_out_goby_number_draws <- goby_out_model |>
  emmeans(~ goby_number, 
          epred = TRUE,
          re_formla = NULL) |> 
  contrast(method = "revpairwise")|> 
  gather_emmeans_draws()

goby_out_goby_number_fig<- ggplot(goby_out_goby_number_draws, aes(x = .value, y = contrast)) +
   geom_vline(xintercept = 0, color = "black", size = 0.5) +
  stat_halfeye(.width = c(0.95))+
  labs(y = "Contrasts of the effect of the number of goby",
       fill = "Noise treatment", color = "Noise treatment",
       fill_ramp = "Credible interval") +
  xlab(NULL) +
  coord_flip()

goby_out_goby_number_fig

####2.3.4.2 Shrimp number

goby_out_shrimp_number <- goby_out_model |>
  emmeans(~ shrimp_number, 
          epred = TRUE,
          re_formla = NULL) |> 
  contrast(method = "revpairwise")

goby_out_shrimp_number
##  contrast                        estimate lower.HPD upper.HPD
##  shrimp_number2 - shrimp_number1   0.1431     0.025     0.269
##  shrimp_number3 - shrimp_number1   0.0867    -0.218     0.355
##  shrimp_number3 - shrimp_number2  -0.0574    -0.366     0.187
## 
## Results are averaged over the levels of: stroke, stage, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
goby_out_shrimp_number_estimates <- goby_out_model |>
  emmeans(~ shrimp_number, 
          epred = TRUE,
          re_formla = NULL)

goby_out_shrimp_number_estimates
##  shrimp_number emmean lower.HPD upper.HPD
##  1              0.566     0.413     0.708
##  2              0.711     0.614     0.803
##  3              0.651     0.339     0.909
## 
## Results are averaged over the levels of: stroke, stage, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
goby_out_shrimp_number_draws <- goby_out_model |>
  emmeans(~ shrimp_number, 
          epred = TRUE,
          re_formla = NULL) |> 
  contrast(method = "revpairwise")|> 
  gather_emmeans_draws()

goby_out_shrimp_number_fig<- ggplot(goby_out_shrimp_number_draws, aes(x = .value, y = contrast)) +
   geom_vline(xintercept = 0, color = "black", size = 0.5) +
  stat_halfeye(.width = c(0.95))+
  labs(y = "Contrasts of the effect of the number of shrimp",
       fill = "Noise treatment", color = "Noise treatment",
       fill_ramp = "Credible interval") +
  xlab(NULL) +
  coord_flip()

goby_out_shrimp_number_fig

####2.3.4.3 Shrimp species

goby_out_shrimp_species <- goby_out_model |>
  emmeans(~ shrimp_species, 
          epred = TRUE,
          re_formla = NULL) |> 
  contrast(method = "revpairwise")

goby_out_shrimp_species <- as.data.frame(goby_out_shrimp_species)

goby_out_shrimp_species_estimates <- goby_out_model |>
  emmeans(~ shrimp_species, 
          epred = TRUE,
          re_formla = NULL)

goby_out_shrimp_species_estimates <- as.data.frame(goby_out_shrimp_species_estimates)

goby_out_shrimp_species_draws <- goby_out_model |>
  emmeans(~ shrimp_species, 
          epred = TRUE,
          re_formla = NULL) |> 
  contrast(method = "revpairwise")|> 
  gather_emmeans_draws()

goby_out_shrimp_species_fig<- ggplot(goby_out_shrimp_species_draws, aes(x = .value, y = contrast)) +
   geom_vline(xintercept = 0, color = "black", size = 0.5) +
  stat_halfeye(.width = c(0.95))+
  labs(y = "Contrasts of the effect of the species of shrimp",
       fill = "Noise treatment", color = "Noise treatment",
       fill_ramp = "Credible interval") +
  xlab(NULL) +
  coord_flip()

goby_out_shrimp_species_fig

##2.4 Modelling the proportion of time shrimp spent outside of the burrow

shrimp_out_formula <- bf(
  # mu (mean) part
  shrimp_out ~ stroke*stage + shrimp_number + goby_number + shrimp_species + (1|site/burrow),
  # phi (precision) part
  phi ~ stroke*stage + shrimp_number + goby_number + shrimp_species + (1|site/burrow),
  # alpha (zero-one-inflation) part
  zoi ~ stroke*stage + shrimp_number + goby_number + shrimp_species + (1|site/burrow),
  # The one-inflated part, conditional on the 0s
  coi ~ stroke*stage + shrimp_number + goby_number + shrimp_species + (1|site/burrow),
  
  family = zero_one_inflated_beta()
)

shrimp_out_model <- brm(
  shrimp_out_formula,
  data = final_df,
  family = zero_one_inflated_beta(),
  prior = priors,
  control = list(adapt_delta = 0.99,
                 max_treedepth = 12),
  chains = 4, iter = 4000, warmup = 1000,
  cores = 4, threads = threading(2),
  backend = "cmdstanr",
  seed = 1,
  file = "shrimp_out_model"
)

summary(shrimp_out_model)
##  Family: zero_one_inflated_beta 
##   Links: mu = logit; phi = log; zoi = logit; coi = logit 
## Formula: shrimp_out ~ stroke * stage + shrimp_number + goby_number + shrimp_species + (1 | site/burrow) 
##          phi ~ stroke * stage + shrimp_number + goby_number + shrimp_species + (1 | site/burrow)
##          zoi ~ stroke * stage + shrimp_number + goby_number + shrimp_species + (1 | site/burrow)
##          coi ~ stroke * stage + shrimp_number + goby_number + shrimp_species + (1 | site/burrow)
##    Data: final_df (Number of observations: 369) 
##   Draws: 4 chains, each with iter = 4000; warmup = 1000; thin = 1;
##          total post-warmup draws = 12000
## 
## Multilevel Hyperparameters:
## ~site (Number of levels: 5) 
##                   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)         0.18      0.18     0.00     0.67 1.00     3882     5427
## sd(phi_Intercept)     0.28      0.26     0.01     0.97 1.00     2972     5304
## sd(zoi_Intercept)     0.53      0.51     0.02     1.84 1.00     5979     6908
## sd(coi_Intercept)     2.26      2.34     0.08     7.93 1.00     9225     7074
## 
## ~site:burrow (Number of levels: 123) 
##                   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)         0.77      0.10     0.58     0.96 1.00     3318     6077
## sd(phi_Intercept)     0.32      0.18     0.02     0.68 1.00     1797     3263
## sd(zoi_Intercept)     2.14      0.60     1.10     3.46 1.00     3039     4614
## sd(coi_Intercept)     2.04      1.77     0.08     6.46 1.00     7376     7213
## 
## Regression Coefficients:
##                               Estimate Est.Error l-95% CI u-95% CI Rhat
## Intercept                        -1.63      0.50    -2.60    -0.62 1.00
## phi_Intercept                     1.60      0.63     0.32     2.79 1.00
## zoi_Intercept                    -2.24      1.49    -5.36     0.60 1.00
## coi_Intercept                    -7.26      4.01   -15.84    -0.13 1.00
## stroke4                           0.21      0.27    -0.30     0.74 1.00
## strokecontrol                     0.38      0.27    -0.15     0.91 1.00
## stagePost                         0.23      0.19    -0.15     0.61 1.00
## stagePre                          0.71      0.19     0.34     1.09 1.00
## shrimp_number2                    0.52      0.26     0.01     1.02 1.00
## shrimp_number3                    0.46      0.54    -0.63     1.54 1.00
## goby_number2                      0.35      0.22    -0.09     0.79 1.00
## shrimp_speciesmannarensis         0.01      0.42    -0.85     0.82 1.00
## shrimp_speciessciolii            -0.61      0.54    -1.68     0.43 1.00
## shrimp_speciesunknown            -0.04      0.46    -0.96     0.85 1.00
## stroke4:stagePost                 0.17      0.29    -0.41     0.74 1.00
## strokecontrol:stagePost           0.00      0.28    -0.55     0.55 1.00
## stroke4:stagePre                 -0.23      0.30    -0.84     0.36 1.00
## strokecontrol:stagePre           -0.57      0.31    -1.19     0.03 1.00
## phi_stroke4                      -0.31      0.46    -1.20     0.62 1.00
## phi_strokecontrol                -0.61      0.42    -1.43     0.22 1.00
## phi_stagePost                    -0.55      0.39    -1.31     0.21 1.00
## phi_stagePre                     -0.58      0.43    -1.42     0.28 1.00
## phi_shrimp_number2                0.74      0.26     0.24     1.24 1.00
## phi_shrimp_number3                2.11      0.78     0.56     3.62 1.00
## phi_goby_number2                  0.06      0.25    -0.44     0.55 1.00
## phi_shrimp_speciesmannarensis    -0.06      0.50    -1.00     0.94 1.00
## phi_shrimp_speciessciolii         0.15      0.57    -0.98     1.26 1.00
## phi_shrimp_speciesunknown         0.07      0.53    -0.92     1.16 1.00
## phi_stroke4:stagePost            -0.15      0.56    -1.25     0.95 1.00
## phi_strokecontrol:stagePost       0.33      0.54    -0.75     1.39 1.00
## phi_stroke4:stagePre             -0.24      0.62    -1.47     0.96 1.00
## phi_strokecontrol:stagePre        0.23      0.58    -0.90     1.36 1.00
## zoi_stroke4                      -0.99      1.01    -3.01     0.90 1.00
## zoi_strokecontrol                -1.31      1.05    -3.48     0.70 1.00
## zoi_stagePost                     0.30      0.67    -1.00     1.60 1.00
## zoi_stagePre                      0.31      0.67    -1.00     1.64 1.00
## zoi_shrimp_number2               -1.89      0.76    -3.50    -0.54 1.00
## zoi_shrimp_number3               -0.75      1.73    -4.26     2.50 1.00
## zoi_goby_number2                 -0.41      0.82    -2.08     1.18 1.00
## zoi_shrimp_speciesmannarensis     0.53      1.30    -1.95     3.16 1.00
## zoi_shrimp_speciessciolii        -0.46      1.75    -4.00     2.86 1.00
## zoi_shrimp_speciesunknown         0.52      1.40    -2.24     3.35 1.00
## zoi_stroke4:stagePost             0.16      1.15    -2.08     2.40 1.00
## zoi_strokecontrol:stagePost      -0.36      1.24    -2.85     2.09 1.00
## zoi_stroke4:stagePre              0.59      1.10    -1.53     2.82 1.00
## zoi_strokecontrol:stagePre       -0.35      1.21    -2.78     1.96 1.00
## coi_stroke4                       2.82      2.39    -1.91     7.61 1.00
## coi_strokecontrol                -0.35      2.64    -5.65     4.74 1.00
## coi_stagePost                    -1.42      2.45    -6.30     3.24 1.00
## coi_stagePre                     -1.73      2.38    -6.54     2.83 1.00
## coi_shrimp_number2               -1.51      2.35    -6.10     3.11 1.00
## coi_shrimp_number3               -0.17      2.92    -5.89     5.42 1.00
## coi_goby_number2                 -0.96      2.59    -6.06     4.12 1.00
## coi_shrimp_speciesmannarensis     0.92      2.59    -4.09     6.06 1.00
## coi_shrimp_speciessciolii        -0.21      2.88    -5.92     5.41 1.00
## coi_shrimp_speciesunknown        -0.76      2.68    -6.11     4.44 1.00
## coi_stroke4:stagePost            -0.68      2.74    -6.12     4.63 1.00
## coi_strokecontrol:stagePost       0.02      2.85    -5.58     5.53 1.00
## coi_stroke4:stagePre             -0.82      2.70    -6.16     4.36 1.00
## coi_strokecontrol:stagePre       -0.06      2.85    -5.68     5.37 1.00
##                               Bulk_ESS Tail_ESS
## Intercept                         6281     7699
## phi_Intercept                     5987     6801
## zoi_Intercept                     9282     8789
## coi_Intercept                    12638     9021
## stroke4                           7249     8499
## strokecontrol                     6875     8837
## stagePost                         7761     9210
## stagePre                          7801     8761
## shrimp_number2                    8817     9194
## shrimp_number3                    8156     8306
## goby_number2                      7773     9380
## shrimp_speciesmannarensis         5688     7345
## shrimp_speciessciolii             6744     7971
## shrimp_speciesunknown             5985     6582
## stroke4:stagePost                 8859     9867
## strokecontrol:stagePost           8952     9915
## stroke4:stagePre                  8574     9542
## strokecontrol:stagePre            7872     9605
## phi_stroke4                       5297     7681
## phi_strokecontrol                 5756     7879
## phi_stagePost                     6296     8223
## phi_stagePre                      5761     7448
## phi_shrimp_number2               12351     9566
## phi_shrimp_number3                9521     9484
## phi_goby_number2                 11371     9212
## phi_shrimp_speciesmannarensis     6299     8200
## phi_shrimp_speciessciolii         8625     9289
## phi_shrimp_speciesunknown         6123     7975
## phi_stroke4:stagePost             6525     8567
## phi_strokecontrol:stagePost       7024     9365
## phi_stroke4:stagePre              5675     8154
## phi_strokecontrol:stagePre        6562     8760
## zoi_stroke4                       9704     8925
## zoi_strokecontrol                11802     9423
## zoi_stagePost                    13321    10398
## zoi_stagePre                     12967     9535
## zoi_shrimp_number2                8275     7292
## zoi_shrimp_number3               14852    10115
## zoi_goby_number2                 11492     9895
## zoi_shrimp_speciesmannarensis    10434     8901
## zoi_shrimp_speciessciolii        11869     9910
## zoi_shrimp_speciesunknown        10623     9022
## zoi_stroke4:stagePost            12509    10233
## zoi_strokecontrol:stagePost      14058     9657
## zoi_stroke4:stagePre             12710     9427
## zoi_strokecontrol:stagePre       14262    10019
## coi_stroke4                      19173     9416
## coi_strokecontrol                25479     9678
## coi_stagePost                    21202     9999
## coi_stagePre                     18921     9438
## coi_shrimp_number2               19814     9356
## coi_shrimp_number3               27342     8037
## coi_goby_number2                 20652     9718
## coi_shrimp_speciesmannarensis    19191     9481
## coi_shrimp_speciessciolii        25735     8216
## coi_shrimp_speciesunknown        21686     8915
## coi_stroke4:stagePost            25821     9399
## coi_strokecontrol:stagePost      28409     8840
## coi_stroke4:stagePre             24599     9850
## coi_strokecontrol:stagePre       27646     7835
## 
## Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

###2.4.1 Model fit and diagnostics ####2.4.1.1 Model convergence

extract_rhats(shrimp_out_model)
##                                    Rhat
## Intercept                     1.0009578
## phi_Intercept                 1.0001122
## zoi_Intercept                 0.9998407
## coi_Intercept                 1.0003119
## stroke4                       1.0005122
## strokecontrol                 1.0005168
## stagePost                     1.0010515
## stagePre                      1.0002930
## shrimp_number2                0.9998931
## shrimp_number3                1.0001058
## goby_number2                  1.0000986
## shrimp_speciesmannarensis     1.0008461
## shrimp_speciessciolii         1.0001949
## shrimp_speciesunknown         1.0006569
## stroke4:stagePost             1.0009191
## strokecontrol:stagePost       1.0007629
## stroke4:stagePre              1.0000436
## strokecontrol:stagePre        1.0003169
## phi_stroke4                   1.0001378
## phi_strokecontrol             1.0003434
## phi_stagePost                 1.0000806
## phi_stagePre                  1.0001811
## phi_shrimp_number2            1.0000424
## phi_shrimp_number3            1.0004788
## phi_goby_number2              0.9999790
## phi_shrimp_speciesmannarensis 1.0008483
## phi_shrimp_speciessciolii     1.0000916
## phi_shrimp_speciesunknown     1.0001554
## phi_stroke4:stagePost         1.0000798
## phi_strokecontrol:stagePost   0.9999300
## phi_stroke4:stagePre          1.0000519
## phi_strokecontrol:stagePre    1.0001820
## zoi_stroke4                   1.0000602
## zoi_strokecontrol             1.0000852
## zoi_stagePost                 0.9999112
## zoi_stagePre                  1.0004444
## zoi_shrimp_number2            0.9998895
## zoi_shrimp_number3            1.0002128
## zoi_goby_number2              0.9999529
## zoi_shrimp_speciesmannarensis 1.0000569
## zoi_shrimp_speciessciolii     1.0000006
## zoi_shrimp_speciesunknown     1.0000500
## zoi_stroke4:stagePost         1.0005978
## zoi_strokecontrol:stagePost   1.0003469
## zoi_stroke4:stagePre          1.0000262
## zoi_strokecontrol:stagePre    1.0000477
## coi_stroke4                   1.0000408
## coi_strokecontrol             1.0003090
## coi_stagePost                 1.0008316
## coi_stagePre                  1.0007659
## coi_shrimp_number2            1.0003090
## coi_shrimp_number3            1.0009424
## coi_goby_number2              1.0005799
## coi_shrimp_speciesmannarensis 1.0006388
## coi_shrimp_speciessciolii     1.0003057
## coi_shrimp_speciesunknown     1.0000471
## coi_stroke4:stagePost         1.0001877
## coi_strokecontrol:stagePost   1.0010580
## coi_stroke4:stagePre          0.9999489
## coi_strokecontrol:stagePre    1.0011478
## site.sd(Intercept)            1.0005361
## site.sd(phi_Intercept)        1.0003269
## site.sd(zoi_Intercept)        1.0003958
## site.sd(coi_Intercept)        1.0002228
## site:burrow.sd(Intercept)     1.0007982
## site:burrow.sd(phi_Intercept) 1.0011935
## site:burrow.sd(zoi_Intercept) 1.0003181
## site:burrow.sd(coi_Intercept) 1.0001578

####2.4.1.2 Model fit

#posterior predictive checks
pp_check(shrimp_out_model)

pp_check(shrimp_out_model, type='stat', stat='mean')

#fitted vs predicted values
summary(fitted(shrimp_out_model))
##     Estimate         Est.Error            Q2.5              Q97.5       
##  Min.   :0.05903   Min.   :0.04699   Min.   :0.001233   Min.   :0.2260  
##  1st Qu.:0.19328   1st Qu.:0.08172   1st Qu.:0.070745   1st Qu.:0.3942  
##  Median :0.30089   Median :0.09558   Median :0.124544   Median :0.5096  
##  Mean   :0.31422   Mean   :0.09622   Mean   :0.145423   Mean   :0.5181  
##  3rd Qu.:0.41508   3rd Qu.:0.10873   3rd Qu.:0.203817   3rd Qu.:0.6305  
##  Max.   :0.70428   Max.   :0.18746   Max.   :0.454831   Max.   :0.8784
summary(predict(shrimp_out_model))
##     Estimate         Est.Error           Q2.5               Q97.5       
##  Min.   :0.05957   Min.   :0.1073   Min.   :0.0000000   Min.   :0.3900  
##  1st Qu.:0.19325   1st Qu.:0.1952   1st Qu.:0.0000000   1st Qu.:0.7223  
##  Median :0.30309   Median :0.2252   Median :0.0000000   Median :0.8399  
##  Mean   :0.31421   Mean   :0.2262   Mean   :0.0007245   Mean   :0.8157  
##  3rd Qu.:0.41371   3rd Qu.:0.2541   3rd Qu.:0.0000000   3rd Qu.:0.9288  
##  Max.   :0.70185   Max.   :0.4021   Max.   :0.0307208   Max.   :1.0000

###2.4.2 Posterior marginal effects ####2.4.2.1 Pairwise contrasts of stroke and stage

shrimp_out_contrasts <- shrimp_out_model |>
  emmeans(~ stroke*stage, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

# Extract the relevant contrast information
shrimp_out_contrasts <- as.data.frame(shrimp_out_contrasts) |> 
  dplyr::filter(contrast %in% c("control Pre - 2 Pre", "control Pre - 4 Pre","4 Pre - 2 Pre", "control Pre - control During", "control Pre - control Post", "4 Pre - 4 During", "4 Pre - 4 Post", "2 Pre - 2 During", "2 Pre - 2 Post"))

shrimp_out_contrasts
##  contrast                        estimate   lower.HPD  upper.HPD
##  2 Pre - 2 During              0.11124122  0.02991038 0.19526550
##  2 Pre - 2 Post                0.08161274 -0.00327231 0.16563823
##  4 Pre - 4 During              0.07146775 -0.03455554 0.18276195
##  4 Pre - 4 Post                0.00424298 -0.10889323 0.11883239
##  4 Pre - 2 Pre                 0.00831290 -0.10911805 0.14158252
##  control Pre - control During  0.02438722 -0.06822417 0.11723333
##  control Pre - control Post   -0.02058155 -0.11291257 0.06807063
##  control Pre - 2 Pre          -0.01089037 -0.13110502 0.11234895
##  control Pre - 4 Pre          -0.01896972 -0.15203909 0.11329580
## 
## Results are averaged over the levels of: shrimp_number, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
shrimp_out_contrast_draws <- shrimp_out_model  |>
  emmeans(~ stroke*stage, 
          epred = TRUE,
          re_formula = NA) |> 
  contrast(method = "revpairwise") |> 
  gather_emmeans_draws()

shrimp_out_temporal_contrasts <- shrimp_out_contrast_draws |> 
  dplyr::filter(contrast %in% c("control Pre - control During", "control Pre - control Post", "4 Pre - 4 During", "4 Pre - 4 Post", "2 Pre - 2 During", "2 Pre - 2 Post")) |> 
  mutate(stroke = ifelse(contrast %in% c("control Pre - control During", "control Pre - control Post"), "Control", ifelse(contrast %in% c("4 Pre - 4 During", "4 Pre - 4 Post"), "4", "2")))

shrimp_out_temporal_contrasts$stroke <- factor(shrimp_out_temporal_contrasts$stroke, levels = c("Control", "4", "2"))

shrimp_out_temporal_contrasts_fig <- ggplot(shrimp_out_temporal_contrasts, aes(x = .value, y = factor(contrast, levels = c("control Pre - control During", "control Pre - control Post", "4 Pre - 4 During", "4 Pre - 4 Post",  "2 Pre - 2 During", "2 Pre - 2 Post")), color = stroke, fill = stroke)) +
  geom_vline(xintercept = 0, color = "black", size = 0.5) +
  stat_halfeye(.width = c(0.89, 0.95)) +
  scale_color_manual(values = c(colour11, colour12, colour13)) +
  scale_fill_manual(values = alpha(c(colour1, colour2, colour3), 0.8)) +
  labs(x = "Difference in the proportion of time spent out of the burrow",
       y = "Contrasts of the time periods relative to noise exposure",
       fill = "Noise treatment", color = "Noise treatment",
       fill_ramp = "Credible interval") +
  coord_flip() +
  theme(legend.position = "top", 
        axis.text.x = element_text(angle = 50, hjust =1)) +
  scale_y_discrete(labels = c("Pre - During", "Pre - Post", "Pre - During", "Pre - Post", "Pre - During", "Pre - Post")) +
  scale_x_continuous(breaks = seq(-0.2, 0.3, 0.1), labels = c("-0.2","-0.1" , "0", "0.1", "0.2", "0.3"), limits = c(-0.3, 0.4)) 


shrimp_out_temporal_contrasts_fig

###2.4.3 Extracting and plotting model estimates ####2.4.3.1 Extracting estimates

shrimp_out_model_estimates <- shrimp_out_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA)

shrimp_out_model_estimates <- as.data.frame(shrimp_out_model_estimates)

shrimp_out_model_estimates
##  stroke  stage     emmean lower.HPD upper.HPD
##  2       During 0.2088068 0.1219075 0.3118424
##  4       During 0.2589222 0.1546599 0.3916332
##  control During 0.2859898 0.1797559 0.4114104
##  2       Post   0.2386264 0.1385769 0.3589095
##  4       Post   0.3262621 0.1927346 0.4706111
##  control Post   0.3334816 0.2124747 0.4633444
##  2       Pre    0.3217096 0.1933117 0.4538872
##  4       Pre    0.3306229 0.1925348 0.4863961
##  control Pre    0.3110556 0.1939448 0.4440628
## 
## Results are averaged over the levels of: shrimp_number, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
#Storing the model estimate means for each group to plot later on
shrimp_out_model_estimates_control <- shrimp_out_model_estimates |> 
  dplyr::filter(stroke == "control") |> 
  rename(.value = emmean)

shrimp_out_model_estimates_four <- shrimp_out_model_estimates |> 
  dplyr::filter(stroke == "4")|> 
  rename(.value = emmean)

shrimp_out_model_estimates_two <- shrimp_out_model_estimates |> 
  dplyr::filter(stroke == "2")|> 
  rename(.value = emmean)

####2.4.3.2 Plotting model estimates and raw data

shrimp_out_model_draws <- shrimp_out_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA) |> 
  gather_emmeans_draws()

shrimp_out_model_draws <- shrimp_out_model_draws |> 
  rename(emmean = .value)

shrimp_out_raw_data <- final_df |> 
  rename(emmean = shrimp_out)

shrimp_out_raw_data$stage <- factor(shrimp_out_raw_data$stage, levels = c("Pre", "During", "Post"))
shrimp_out_raw_data$stroke <- factor(shrimp_out_raw_data$stroke, levels = c("control", "4", "2"))

shrimp_out_model_estimates$stage <- factor(shrimp_out_model_estimates$stage, levels = c("Pre", "During", "Post"))
shrimp_out_model_estimates$stroke <- factor(shrimp_out_model_estimates$stroke, levels = c("control", "4", "2"))

shrimp_out_model_draws$stage <- factor(shrimp_out_model_draws$stage, levels = c("Pre", "During", "Post"))
shrimp_out_model_draws$stroke <- factor(shrimp_out_model_draws$stroke, levels = c("control", "4", "2"))

shrimp_out_means <- shrimp_out_raw_data |> 
  group_by(stage, stroke) |> 
  summarise(emmean = mean(emmean))


shrimp_out_fig_together <- ggplot(data = shrimp_out_raw_data, aes(x = stage, y = emmean, color = stroke, fill = stroke)) +
  geom_point(data = shrimp_out_means, alpha = 1, position = position_dodgenudge(width = 0.8, x = -0.09), size = 9, shape = "_") +
  geom_half_point(alpha = 0.3, position = position_dodgenudge(width = 0.8, x = -0.03), side = "l", range_scale = 0.5) +
  geom_half_violin(data = shrimp_out_model_draws, aes(x = stage, y = emmean, color = stroke, fill = stroke), alpha = 0.6, position = position_dodge(width = 0.8), side = "r", size = 0) +
  geom_point(data = shrimp_out_model_estimates, aes(x = stage, y = emmean, color = stroke), position = position_dodge(width = 0.8), size = 3) +
  geom_errorbar(data = shrimp_out_model_estimates, aes(x = stage, y = emmean, ymin = lower.HPD, ymax = upper.HPD, color = stroke), position = position_dodge(width = 0.8), width = 0, size = 1.25) +
  scale_fill_manual(values = c("control" = "#76A34A", "4" = "#F29E00", "2" = "#E25A00"), name = "Noise exposure", guide = guide_legend(override.aes = list(size = 3))) +
  scale_color_manual(values = c("control" = "#2A330E", "4" = "#805213", "2" = "#542709"), name = "Noise exposure", guide = guide_legend(override.aes = list(size = 3))) +
  scale_x_discrete(labels = c("Pre", "During", "Post")) +
  labs(title = "The effects of boat noise on shrimp burrow use",
       y = "Proportion of time in out of the burrow",
       x = "Experimental phase relative to noise exposure") +
  theme_classic() +
  theme(
    axis.text.x = element_text(size = 10, margin = margin(t = 5)),  
    axis.text.y = element_text(size = 10, margin = margin(r = 5)),  
    axis.title.x = element_text(size = 13, margin = margin(t = 10)),
    axis.title.y = element_text(size = 13, margin = margin(r = 10)),
    legend.text = element_text(size = 10),
    legend.title = element_text(size = 10),
    legend.position = "right",
    legend.justification = "top",
    plot.title = element_text(hjust = 0.5, size = 16),  
    plot.margin = margin(10, 10, 10, 10)
  )

shrimp_out_fig_together

####2.4.3.3 Plotting control estimates and raw data

shrimp_out_model_draws <- shrimp_out_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA) |> 
  gather_emmeans_draws()

shrimp_out_raw_data <- final_df |>
  rename(.value = shrimp_out)

shrimp_out_model_draws$stage <- factor(shrimp_out_model_draws$stage, levels = c("Pre", "During", "Post"))
shrimp_out_model_draws$stroke <- factor(shrimp_out_model_draws$stroke, levels = c("control", "4", "2"))

shrimp_out_control_model_draws <- shrimp_out_model_draws |> 
  dplyr::filter(stroke == "control")

shrimp_control_raw_data <- final_df |> 
  dplyr::filter(stroke =="control") |> 
  rename(.value = shrimp_out)

shrimp_control_means <- shrimp_control_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

shrimp_control_raw_data$stage <- factor(shrimp_control_raw_data$stage, levels = c("Pre", "During", "Post"))

#assigning a value for the baseline mean
shrimp_out_model_estimates_control_intercept <- shrimp_out_model_estimates_control %>%
  dplyr::filter(stage == "Pre") %>%
  pull(.value)

shrimp_out_fig_control <- ggplot(shrimp_control_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = shrimp_out_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = shrimp_out_model_estimates_control, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = shrimp_out_model_estimates_control, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = shrimp_control_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  labs(x="Period relative to treatment",
       y="Proportion of time out of burrow") +
  theme(legend.position = "none", 
        axis.title.x = element_blank(), 
        axis.text.x = element_text(size = 13),  
        axis.text.y = element_text(size = 13),
        panel.grid = element_blank(),
        axis.title.y = element_text(size = 16, face = "bold", margin = margin(t = 0, b = 0, l = 0, r = 10)),
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#A3C088", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("Control")+
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#76A34A", "Post" = "#D3D9A7")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#2A330E", "Post" = "#5d634c"))

shrimp_out_fig_control

####2.4.3.4 Plotting 4-stroke estimates and raw data

shrimp_out_control_model_draws <- shrimp_out_model_draws |> 
  dplyr::filter(stroke == "4")

shrimp_four_raw_data <- final_df |> 
  dplyr::filter(stroke =="4") |> 
  rename(.value = shrimp_out)

shrimp_four_raw_data$stage <- factor(shrimp_four_raw_data$stage, levels = c("Pre", "During", "Post"))

shrimp_four_means <- shrimp_four_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

shrimp_out_fig_four <- ggplot(shrimp_four_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = shrimp_out_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = shrimp_out_model_estimates_four, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = shrimp_out_model_estimates_four, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = shrimp_four_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  xlab("Experimental phase relative to noise exposure")+
  theme(legend.position = "none", 
        axis.title.y = element_blank(),  
        axis.text.x = element_text(size = 13),  
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        panel.grid = element_blank(),
        axis.title.x = element_text(size = 16, face = "bold", margin = margin(t = 15, b = 0, l = 0, r = 0)),
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#F6BC65", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("4-stroke")+
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#F29E00", "Post" = "#F2D5A0")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#805213", "Post" = "#70532b"))

shrimp_out_fig_four

####2.4.3.5 Plotting 2-stroke estimates and raw data

shrimp_out_control_model_draws <- shrimp_out_model_draws |> 
  dplyr::filter(stroke == "2")

shrimp_two_raw_data <- final_df |> 
  dplyr::filter(stroke =="2") |> 
  rename(.value = shrimp_out)

shrimp_two_raw_data$stage <- factor(shrimp_two_raw_data$stage, levels = c("Pre", "During", "Post"))

shrimp_two_means <- shrimp_two_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

shrimp_out_fig_two <- ggplot(shrimp_two_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = shrimp_out_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = shrimp_out_model_estimates_two, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = shrimp_out_model_estimates_two, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = shrimp_two_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  theme(legend.position = "none", 
        axis.title.x = element_blank(),  
        axis.text.x = element_text(size = 13),
        axis.title.y = element_blank(), 
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        panel.grid = element_blank(),
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#EB9063", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("2-stroke") +
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#E25A00", "Post" = "#F2B389")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#542709", "Post" = "#66422a"))

shrimp_out_fig_two

####2.4.3.6 Combining plots into one figure

shrimp_out_plot3 <- shrimp_out_fig_control + shrimp_out_fig_four + shrimp_out_fig_two + 
  plot_layout(ncol = 3)

shrimp_out_plot3

ggsave("./3-figs/shrimp_out_plot3.jpeg", plot = shrimp_out_plot3, units = "px", width = 2200, height = 1400, dpi = 300)

###2.4.4 Effects of covariates on the proportion of time shrimp spent outside of the burrow ####2.4.4.1 Goby number

shrimp_out_goby_number_contrasts <- shrimp_out_model |>
  emmeans(~ goby_number, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

shrimp_out_goby_number_contrasts
##  contrast                    estimate lower.HPD upper.HPD
##  goby_number2 - goby_number1   0.0667    -0.019      0.16
## 
## Results are averaged over the levels of: stroke, stage, shrimp_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95

####2.4.4.2 Shrimp number

shrimp_out_shrimp_number_contrasts <- shrimp_out_model |>
  emmeans(~ shrimp_number, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

shrimp_out_shrimp_number_contrasts <- as.data.frame(shrimp_out_shrimp_number_contrasts)

shrimp_out_shrimp_number_estimates <- shrimp_out_model |>
  emmeans(~ shrimp_number, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000)

shrimp_out_shrimp_number_estimates
##  shrimp_number emmean lower.HPD upper.HPD
##  1              0.223     0.129     0.329
##  2              0.339     0.262     0.433
##  3              0.308     0.124     0.534
## 
## Results are averaged over the levels of: stroke, stage, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
shrimp_out_shrimp_number_contrast_draws <- shrimp_out_model |>
  emmeans(~ shrimp_number, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") |> 
  gather_emmeans_draws()

ggplot(data = shrimp_out_shrimp_number_contrast_draws, aes(x = contrast, y = .value )) +
  stat_halfeye()

####2.4.4.3 Shrimp species

shrimp_out_shrimp_species_contrasts <- shrimp_out_model |>
  emmeans(~ shrimp_species, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

shrimp_out_shrimp_species_contrasts
##  contrast               estimate lower.HPD upper.HPD
##  mannarensis - bellulus  0.00168   -0.1752    0.1547
##  sciolii - bellulus     -0.09937   -0.3017    0.0899
##  sciolii - mannarensis  -0.10302   -0.2208    0.0390
##  unknown - bellulus     -0.01135   -0.2049    0.1599
##  unknown - mannarensis  -0.01330   -0.1033    0.0914
##  unknown - sciolii       0.08881   -0.0588    0.2365
## 
## Results are averaged over the levels of: stroke, stage, shrimp_number, goby_number 
## Point estimate displayed: median 
## HPD interval probability: 0.95
shrimp_out_shrimp_species_contrasts_draws <- shrimp_out_model |>
  emmeans(~ shrimp_species, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") |> 
  gather_emmeans_draws()

ggplot(data = shrimp_out_shrimp_species_contrasts_draws, aes(x = contrast, y = .value )) +
  stat_halfeye()

##2.5 Modelling the proportion of time shrimp spent in contact with the goby ###2.5.1 Checking the response variable distribution

shrimp_contact_df <- final_df |> 
  mutate(is_zero = shrimp_contact == 0)

shrimp_contact_plot <- shrimp_contact_df |> 
  mutate(shrimp_contact = ifelse(is_zero, -0.1, shrimp_contact)) |> 
  ggplot(aes(x = shrimp_contact)) +
  geom_histogram(aes(fill = is_zero), binwidth = 0.05, 
                 boundary = 0, color = "white") +
  geom_vline(xintercept = 0)
shrimp_contact_plot

# Distribution is a zero-one inflated beta distribution, because the value for shrimp_contact is bounded by 0-1 as it is a proportion of the total time and there is values of 0 and 1.

###2.5.2 Running the model

shrimp_contact_model <- brm(
  bf(shrimp_contact ~ stroke*stage + shrimp_number + goby_number + shrimp_species + (1|site/burrow),
     phi ~ stroke*stage + shrimp_number + goby_number + shrimp_species + (1|site/burrow),
     zoi ~ stroke*stage + shrimp_number + goby_number + shrimp_species + (1|site/burrow),
     coi ~ stroke*stage + shrimp_number + goby_number + shrimp_species + (1|site/burrow)
     ),
  data = final_df,
  prior = priors,
  family = zero_one_inflated_beta(),
  control = list(adapt_delta = 0.99, max_treedepth = 12),
  chains = 4, iter = 6000, warmup = 1000, seed = 1, backend = "cmdstanr", cores = 4, threads = threading(2),
  file = "shrimp_contact_model"
)

summary(shrimp_contact_model)
##  Family: zero_one_inflated_beta 
##   Links: mu = logit; phi = log; zoi = logit; coi = logit 
## Formula: shrimp_contact ~ stroke * stage + shrimp_number + goby_number + shrimp_species + (1 | site/burrow) 
##          phi ~ stroke * stage + shrimp_number + goby_number + shrimp_species + (1 | site/burrow)
##          zoi ~ stroke * stage + shrimp_number + goby_number + shrimp_species + (1 | site/burrow)
##          coi ~ stroke * stage + shrimp_number + goby_number + shrimp_species + (1 | site/burrow)
##    Data: final_df (Number of observations: 369) 
##   Draws: 4 chains, each with iter = 6000; warmup = 1000; thin = 1;
##          total post-warmup draws = 20000
## 
## Multilevel Hyperparameters:
## ~site (Number of levels: 5) 
##                   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)         0.31      0.28     0.01     1.01 1.00     4422     6853
## sd(phi_Intercept)     0.29      0.28     0.01     0.99 1.00     5122     6538
## sd(zoi_Intercept)     1.20      0.86     0.08     3.34 1.00     5704     6800
## sd(coi_Intercept)     2.44      1.97     0.09     7.26 1.00     7853     7421
## 
## ~site:burrow (Number of levels: 123) 
##                   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)         0.81      0.10     0.63     1.01 1.00     4557     7393
## sd(phi_Intercept)     0.70      0.17     0.37     1.03 1.00     3649     4764
## sd(zoi_Intercept)     2.66      0.61     1.64     4.04 1.00     6766    11703
## sd(coi_Intercept)     7.19      3.93     2.17    16.86 1.00     8258     8479
## 
## Regression Coefficients:
##                               Estimate Est.Error l-95% CI u-95% CI Rhat
## Intercept                         0.79      0.55    -0.25     1.89 1.00
## phi_Intercept                     1.12      0.67    -0.19     2.47 1.00
## zoi_Intercept                    -4.78      1.94    -8.72    -1.11 1.00
## coi_Intercept                     1.38      3.94    -5.97     9.56 1.00
## stroke4                           0.65      0.29     0.09     1.22 1.00
## strokecontrol                     0.29      0.28    -0.26     0.83 1.00
## stagePost                         0.26      0.18    -0.09     0.62 1.00
## stagePre                          0.12      0.17    -0.21     0.46 1.00
## shrimp_number2                   -0.29      0.26    -0.79     0.21 1.00
## shrimp_number3                   -0.44      0.59    -1.61     0.73 1.00
## goby_number2                      0.09      0.25    -0.40     0.57 1.00
## shrimp_speciesmannarensis         0.06      0.46    -0.86     0.97 1.00
## shrimp_speciessciolii            -0.74      0.58    -1.89     0.37 1.00
## shrimp_speciesunknown            -0.27      0.51    -1.28     0.73 1.00
## stroke4:stagePost                 0.00      0.27    -0.53     0.54 1.00
## strokecontrol:stagePost          -0.07      0.28    -0.62     0.46 1.00
## stroke4:stagePre                 -0.27      0.30    -0.86     0.32 1.00
## strokecontrol:stagePre            0.12      0.29    -0.45     0.68 1.00
## phi_stroke4                      -0.63      0.44    -1.49     0.21 1.00
## phi_strokecontrol                -0.56      0.44    -1.43     0.31 1.00
## phi_stagePost                    -0.46      0.39    -1.24     0.29 1.00
## phi_stagePre                     -0.16      0.41    -0.97     0.64 1.00
## phi_shrimp_number2                0.63      0.31     0.03     1.24 1.00
## phi_shrimp_number3                1.21      0.83    -0.48     2.78 1.00
## phi_goby_number2                 -0.08      0.31    -0.69     0.52 1.00
## phi_shrimp_speciesmannarensis     0.51      0.53    -0.55     1.55 1.00
## phi_shrimp_speciessciolii         0.05      0.68    -1.27     1.38 1.00
## phi_shrimp_speciesunknown         0.56      0.59    -0.59     1.72 1.00
## phi_stroke4:stagePost             1.91      0.66     0.69     3.29 1.00
## phi_strokecontrol:stagePost       0.81      0.59    -0.32     1.96 1.00
## phi_stroke4:stagePre              0.45      0.59    -0.71     1.59 1.00
## phi_strokecontrol:stagePre        0.01      0.58    -1.14     1.13 1.00
## zoi_stroke4                       0.68      1.08    -1.43     2.85 1.00
## zoi_strokecontrol                 0.68      1.08    -1.45     2.83 1.00
## zoi_stagePost                     0.33      0.77    -1.17     1.84 1.00
## zoi_stagePre                     -0.37      0.80    -1.97     1.17 1.00
## zoi_shrimp_number2               -1.12      0.86    -2.86     0.54 1.00
## zoi_shrimp_number3               -2.46      2.25    -7.16     1.75 1.00
## zoi_goby_number2                 -1.17      1.00    -3.27     0.70 1.00
## zoi_shrimp_speciesmannarensis     1.58      1.59    -1.44     4.83 1.00
## zoi_shrimp_speciessciolii        -0.21      1.98    -4.16     3.60 1.00
## zoi_shrimp_speciesunknown         1.58      1.66    -1.65     4.96 1.00
## zoi_stroke4:stagePost             0.05      1.08    -2.07     2.17 1.00
## zoi_strokecontrol:stagePost      -0.31      1.12    -2.50     1.90 1.00
## zoi_stroke4:stagePre              0.72      1.11    -1.44     2.94 1.00
## zoi_strokecontrol:stagePre        0.76      1.13    -1.48     2.96 1.00
## coi_stroke4                       0.83      2.44    -4.06     5.54 1.00
## coi_strokecontrol                 1.57      2.48    -3.43     6.34 1.00
## coi_stagePost                    -0.24      1.76    -3.70     3.26 1.00
## coi_stagePre                      2.13      2.02    -1.70     6.28 1.00
## coi_shrimp_number2                1.40      2.36    -3.32     5.98 1.00
## coi_shrimp_number3               -0.04      3.00    -5.98     5.83 1.00
## coi_goby_number2                 -0.14      2.52    -5.10     4.81 1.00
## coi_shrimp_speciesmannarensis    -0.13      2.57    -5.22     4.93 1.00
## coi_shrimp_speciessciolii         0.49      2.89    -5.19     6.19 1.00
## coi_shrimp_speciesunknown        -0.27      2.59    -5.40     4.82 1.00
## coi_stroke4:stagePost             0.40      2.58    -4.65     5.54 1.00
## coi_strokecontrol:stagePost       1.88      2.36    -2.66     6.61 1.00
## coi_stroke4:stagePre             -1.58      2.64    -6.70     3.77 1.00
## coi_strokecontrol:stagePre        1.38      2.68    -3.79     6.76 1.00
##                               Bulk_ESS Tail_ESS
## Intercept                         6931    10771
## phi_Intercept                     7413    10243
## zoi_Intercept                    11633    13219
## coi_Intercept                    14488    13507
## stroke4                           7744    11935
## strokecontrol                     7915    11314
## stagePost                        10543    13593
## stagePre                         11260    13581
## shrimp_number2                    9739    12868
## shrimp_number3                   10393    12786
## goby_number2                      8642    12549
## shrimp_speciesmannarensis         6838    10512
## shrimp_speciessciolii             7494    11358
## shrimp_speciesunknown             6544    11073
## stroke4:stagePost                11045    13645
## strokecontrol:stagePost          10755    14071
## stroke4:stagePre                 11336    14368
## strokecontrol:stagePre           11378    13322
## phi_stroke4                       8909    12654
## phi_strokecontrol                 8540    12610
## phi_stagePost                     8783    12203
## phi_stagePre                      7984    11110
## phi_shrimp_number2               13965    14698
## phi_shrimp_number3               13928    15287
## phi_goby_number2                 13076    15075
## phi_shrimp_speciesmannarensis     8798    12296
## phi_shrimp_speciessciolii        10314    12900
## phi_shrimp_speciesunknown         8926    12135
## phi_stroke4:stagePost             7770     9350
## phi_strokecontrol:stagePost       9489    13376
## phi_stroke4:stagePre              9042    12575
## phi_strokecontrol:stagePre        8918    12709
## zoi_stroke4                      11241    13071
## zoi_strokecontrol                11641    14480
## zoi_stagePost                    14076    15104
## zoi_stagePre                     14115    15298
## zoi_shrimp_number2               11327    12262
## zoi_shrimp_number3               22346    14674
## zoi_goby_number2                 12953    13675
## zoi_shrimp_speciesmannarensis    13225    13825
## zoi_shrimp_speciessciolii        16521    15458
## zoi_shrimp_speciesunknown        13672    13882
## zoi_stroke4:stagePost            15603    15941
## zoi_strokecontrol:stagePost      15126    14384
## zoi_stroke4:stagePre             15084    16658
## zoi_strokecontrol:stagePre       15955    15657
## coi_stroke4                      19934    16256
## coi_strokecontrol                19540    16407
## coi_stagePost                    23374    15629
## coi_stagePre                     20406    15606
## coi_shrimp_number2               18466    14794
## coi_shrimp_number3               36617    14014
## coi_goby_number2                 24408    16540
## coi_shrimp_speciesmannarensis    24686    15542
## coi_shrimp_speciessciolii        34026    15571
## coi_shrimp_speciesunknown        24079    14807
## coi_stroke4:stagePost            28690    16315
## coi_strokecontrol:stagePost      26483    15080
## coi_stroke4:stagePre             23479    15804
## coi_strokecontrol:stagePre       25369    14685
## 
## Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

###2.5.3 Model fit and diagnostics ####2.5.3.1 Model convergence

extract_rhats(shrimp_contact_model)
##                                    Rhat
## Intercept                     1.0005227
## phi_Intercept                 1.0001435
## zoi_Intercept                 0.9999331
## coi_Intercept                 1.0000882
## stroke4                       1.0004395
## strokecontrol                 1.0003713
## stagePost                     0.9999568
## stagePre                      1.0002299
## shrimp_number2                1.0007670
## shrimp_number3                1.0004739
## goby_number2                  1.0003800
## shrimp_speciesmannarensis     1.0003644
## shrimp_speciessciolii         1.0003243
## shrimp_speciesunknown         1.0003862
## stroke4:stagePost             0.9999707
## strokecontrol:stagePost       1.0000321
## stroke4:stagePre              1.0000330
## strokecontrol:stagePre        1.0000546
## phi_stroke4                   1.0002337
## phi_strokecontrol             1.0001813
## phi_stagePost                 1.0001259
## phi_stagePre                  0.9998986
## phi_shrimp_number2            1.0002640
## phi_shrimp_number3            1.0003272
## phi_goby_number2              1.0001709
## phi_shrimp_speciesmannarensis 1.0003540
## phi_shrimp_speciessciolii     1.0001288
## phi_shrimp_speciesunknown     1.0001611
## phi_stroke4:stagePost         1.0001231
## phi_strokecontrol:stagePost   1.0001511
## phi_stroke4:stagePre          1.0000056
## phi_strokecontrol:stagePre    0.9999452
## zoi_stroke4                   1.0003425
## zoi_strokecontrol             1.0000268
## zoi_stagePost                 1.0002708
## zoi_stagePre                  1.0003081
## zoi_shrimp_number2            1.0001342
## zoi_shrimp_number3            1.0002038
## zoi_goby_number2              1.0003639
## zoi_shrimp_speciesmannarensis 0.9999935
## zoi_shrimp_speciessciolii     1.0000000
## zoi_shrimp_speciesunknown     1.0000693
## zoi_stroke4:stagePost         1.0001350
## zoi_strokecontrol:stagePost   1.0003289
## zoi_stroke4:stagePre          1.0000980
## zoi_strokecontrol:stagePre    1.0001916
## coi_stroke4                   1.0001010
## coi_strokecontrol             1.0001607
## coi_stagePost                 1.0001902
## coi_stagePre                  1.0001910
## coi_shrimp_number2            1.0001098
## coi_shrimp_number3            1.0005204
## coi_goby_number2              1.0002211
## coi_shrimp_speciesmannarensis 0.9999856
## coi_shrimp_speciessciolii     1.0002105
## coi_shrimp_speciesunknown     1.0001963
## coi_stroke4:stagePost         1.0004001
## coi_strokecontrol:stagePost   1.0001634
## coi_stroke4:stagePre          1.0001430
## coi_strokecontrol:stagePre    1.0000101
## site.sd(Intercept)            1.0004136
## site.sd(phi_Intercept)        1.0005560
## site.sd(zoi_Intercept)        1.0005406
## site.sd(coi_Intercept)        1.0001427
## site:burrow.sd(Intercept)     1.0003338
## site:burrow.sd(phi_Intercept) 1.0008470
## site:burrow.sd(zoi_Intercept) 1.0001670
## site:burrow.sd(coi_Intercept) 1.0002173

####2.5.3.2 Model fit

#posterior predictive checks
pp_check(shrimp_contact_model)

pp_check(shrimp_contact_model, type='stat', stat='mean')

#fitted vs predicted values
summary(fitted(shrimp_contact_model))
##     Estimate        Est.Error            Q2.5             Q97.5       
##  Min.   :0.2926   Min.   :0.06588   Min.   :0.03164   Min.   :0.5580  
##  1st Qu.:0.5898   1st Qu.:0.08469   1st Qu.:0.35528   1st Qu.:0.7970  
##  Median :0.7144   Median :0.09551   Median :0.48913   Median :0.8763  
##  Mean   :0.6882   Mean   :0.10260   Mean   :0.46080   Mean   :0.8580  
##  3rd Qu.:0.8059   3rd Qu.:0.10986   3rd Qu.:0.58302   3rd Qu.:0.9377  
##  Max.   :0.9398   Max.   :0.22480   Max.   :0.73064   Max.   :0.9991
summary(predict(shrimp_contact_model))
##     Estimate        Est.Error           Q2.5             Q97.5       
##  Min.   :0.2921   Min.   :0.1464   Min.   :0.00000   Min.   :0.8419  
##  1st Qu.:0.5906   1st Qu.:0.1926   1st Qu.:0.01054   1st Qu.:1.0000  
##  Median :0.7147   Median :0.2166   Median :0.10769   Median :1.0000  
##  Mean   :0.6881   Mean   :0.2309   Mean   :0.13260   Mean   :0.9942  
##  3rd Qu.:0.8069   3rd Qu.:0.2523   3rd Qu.:0.21747   3rd Qu.:1.0000  
##  Max.   :0.9400   Max.   :0.4517   Max.   :0.53511   Max.   :1.0000

###2.5.2 Posterior marginal effects ####2.5.2.1 Pairwise contrasts of stroke and stage

shrimp_contact_contrasts <- shrimp_contact_model |>
  emmeans(~ stroke*stage, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

overall_mean <- shrimp_contact_model |>
  emmeans(~ 1,             # 1 means "no factors," i.e. the grand mean
          epred = TRUE,    # estimate on the response scale
          re_formla = NULL,
          rg.limit = 14000)

# View the summary with posterior mean and credible intervals
overall_mean
##  1       emmean lower.HPD upper.HPD
##  overall  0.671     0.543     0.789
## 
## Results are averaged over the levels of: stroke, stage, shrimp_number, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
# Extract the relevant contrast information
shrimp_contact_contrasts <- as.data.frame(shrimp_contact_contrasts) |> 
  dplyr::filter(contrast %in% c("control Pre - 2 Pre", "control Pre - 4 Pre","4 Pre - 2 Pre", "control Pre - control During", "control Pre - control Post", "4 Pre - 4 During", "4 Pre - 4 Post", "2 Pre - 2 During", "2 Pre - 2 Post"))

shrimp_contact_contrasts
##  contrast                        estimate   lower.HPD  upper.HPD
##  2 Pre - 2 During              0.02860599 -0.04343278 0.10629264
##  2 Pre - 2 Post               -0.02610253 -0.10486712 0.06071043
##  4 Pre - 4 During             -0.02770567 -0.12792281 0.07167053
##  4 Pre - 4 Post               -0.07128725 -0.16326137 0.01637126
##  4 Pre - 2 Pre                 0.07507622 -0.04516392 0.19730855
##  control Pre - control During  0.05412175 -0.03917928 0.15588585
##  control Pre - control Post    0.01348306 -0.08026895 0.10607465
##  control Pre - 2 Pre           0.09079625 -0.03019632 0.21535561
##  control Pre - 4 Pre           0.01527249 -0.11322530 0.14688317
## 
## Results are averaged over the levels of: shrimp_number, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
shrimp_contact_contrasts_draws <- shrimp_contact_model  |>
  emmeans(~ stroke*stage, 
          epred = TRUE,
          re_formula = NA) |> 
  contrast(method = "revpairwise") |> 
  gather_emmeans_draws()

shrimp_contact_temporal_contrasts <- shrimp_contact_contrasts_draws |> 
  dplyr::filter(contrast %in% c("control Pre - control During", "control Pre - control Post","control Post - control During" , "4 Pre - 4 During", "4 Pre - 4 Post", "4 Post - 4 During", "2 Pre - 2 During", "2 Pre - 2 Post", "2 Post - 2 During")) |> 
  mutate(stroke = ifelse(contrast %in% c("control Pre - control During", "control Pre - control Post","control Post - control During"), "Control", ifelse(contrast %in% c("4 Pre - 4 During", "4 Pre - 4 Post", "4 Post - 4 During"), "4", "2")))

shrimp_contact_temporal_contrasts$stroke <- factor(shrimp_contact_temporal_contrasts$stroke, levels = c("Control", "4", "2"))

shrimp_contact_temporal_fig<- ggplot(shrimp_contact_temporal_contrasts, aes(x = .value, y = factor(contrast, levels = c("control Pre - control During", "control Pre - control Post","control Post - control During" , "4 Pre - 4 During", "4 Pre - 4 Post", "4 Post - 4 During", "2 Pre - 2 During", "2 Pre - 2 Post", "2 Post - 2 During")), color = stroke, fill = stroke)) +
   geom_vline(xintercept = 0, color = "black", size = 0.5) +
  stat_halfeye(.width = c(0.89, 0.95)) +
  scale_color_manual(values = c(colour11, colour12, colour13)) +
  scale_fill_manual(values = alpha(c(colour1, colour2, colour3), 0.8)) +
  labs(x = "Difference in the proportion of time spent out of the burrow",
       y = "Contrasts of the time periods relative to noise exposure",
       fill = "Noise treatment", color = "Noise treatment",
       fill_ramp = "Credible interval") +
  coord_flip() +
  theme(legend.position = "top", 
        axis.text.x = element_text(angle = 50, hjust =1)) +
  scale_y_discrete(labels = c("Pre - During", "Pre - Post","Post - During" , "Pre - During", "Pre - Post", "Post - During", "Pre - During", "Pre - Post", "Post - During")) +
  scale_x_continuous(breaks = seq(-0.2, 0.3, 0.1), labels = c("-0.2","-0.1" , "0", "0.1", "0.2", "0.3"), limits = c(-0.2, 0.3)) 


shrimp_contact_temporal_fig

###2.5.3 Extracting and plotting model estimates ####2.5.3.1 Extracting estimates

shrimp_contact_model_estimates <- shrimp_contact_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA)

shrimp_contact_model |> 
  emmeans(~ 1,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA)
##  1       emmean lower.HPD upper.HPD
##  overall  0.671     0.543     0.789
## 
## Results are averaged over the levels of: stroke, stage, shrimp_number, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
shrimp_contact_model_estimates <- as.data.frame(shrimp_contact_model_estimates)

shrimp_contact_model_estimates
##  stroke  stage     emmean lower.HPD upper.HPD
##  2       During 0.5833632 0.4287101 0.7201552
##  4       During 0.7175983 0.5615712 0.8568383
##  control During 0.6488437 0.4991426 0.7897400
##  2       Post   0.6397286 0.4872690 0.7778386
##  4       Post   0.7623786 0.6225847 0.8801669
##  control Post   0.6905964 0.5467257 0.8199855
##  2       Pre    0.6127777 0.4593987 0.7542849
##  4       Pre    0.6893009 0.5230593 0.8280634
##  control Pre    0.7050247 0.5548278 0.8339999
## 
## Results are averaged over the levels of: shrimp_number, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95
#Storing the model estimate means for each group to plot later on
shrimp_contact_model_estimates_control <- shrimp_contact_model_estimates |> 
  dplyr::filter(stroke == "control") |> 
  rename(.value = emmean)

shrimp_contact_model_estimates_four <- shrimp_contact_model_estimates |> 
  dplyr::filter(stroke == "4")|> 
  rename(.value = emmean)

shrimp_contact_model_estimates_two <- shrimp_contact_model_estimates |> 
  dplyr::filter(stroke == "2")|> 
  rename(.value = emmean)

####2.5.3.2 Plotting model estimates and raw data

shrimp_contact_model_draws <- shrimp_contact_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA) |> 
  gather_emmeans_draws()

shrimp_contact_model_draws <- shrimp_contact_model_draws |> 
  rename(emmean = .value)

shrimp_contact_raw_data <- final_df |> 
  rename(emmean = shrimp_contact)

shrimp_contact_raw_data$stage <- factor(shrimp_contact_raw_data$stage, levels = c("Pre", "During", "Post"))
shrimp_contact_raw_data$stroke <- factor(shrimp_contact_raw_data$stroke, levels = c("control", "4", "2"))

shrimp_contact_model_estimates$stage <- factor(shrimp_contact_model_estimates$stage, levels = c("Pre", "During", "Post"))
shrimp_contact_model_estimates$stroke <- factor(shrimp_contact_model_estimates$stroke, levels = c("control", "4", "2"))

shrimp_contact_model_draws$stage <- factor(shrimp_contact_model_draws$stage, levels = c("Pre", "During", "Post"))
shrimp_contact_model_draws$stroke <- factor(shrimp_contact_model_draws$stroke, levels = c("control", "4", "2"))

shrimp_contact_means <- shrimp_contact_raw_data |> 
  group_by(stage, stroke) |> 
  summarise(emmean = mean(emmean))


shrimp_contact_fig_together <- ggplot(data = shrimp_contact_raw_data, aes(x = stage, y = emmean, color = stroke, fill = stroke)) +
  geom_point(data = shrimp_contact_means, alpha = 1, position = position_dodgenudge(width = 0.8, x = -0.09), size = 9, shape = "_") +
  geom_half_point(alpha = 0.3, position = position_dodgenudge(width = 0.8, x = -0.03), side = "l", range_scale = 0.5) +
  geom_half_violin(data = shrimp_contact_model_draws, aes(x = stage, y = emmean, color = stroke, fill = stroke), alpha = 0.6, position = position_dodge(width = 0.8), side = "r", size = 0) +
  geom_point(data = shrimp_contact_model_estimates, aes(x = stage, y = emmean, color = stroke), position = position_dodge(width = 0.8), size = 3) +
  geom_errorbar(data = shrimp_contact_model_estimates, aes(x = stage, y = emmean, ymin = lower.HPD, ymax = upper.HPD, color = stroke), position = position_dodge(width = 0.8), width = 0, size = 1.25) +
  scale_fill_manual(values = c("control" = "#76A34A", "4" = "#F29E00", "2" = "#E25A00"), name = "Noise exposure", guide = guide_legend(override.aes = list(size = 3))) +
  scale_color_manual(values = c("control" = "#2A330E", "4" = "#805213", "2" = "#542709"), name = "Noise exposure", guide = guide_legend(override.aes = list(size = 3))) +
  scale_x_discrete(labels = c("Pre", "During", "Post")) +
  labs(title = "The effects of boat noise on goby-shrimp contact",
       y = "Proportion of time the in contact",
       x = "Experimental phase relative to noise exposure") +
  theme_classic() +
  theme(
    axis.text.x = element_text(size = 10, margin = margin(t = 5)),  
    axis.text.y = element_text(size = 10, margin = margin(r = 5)),  
    axis.title.x = element_text(size = 13, margin = margin(t = 10)),
    axis.title.y = element_text(size = 13, margin = margin(r = 10)),
    legend.text = element_text(size = 10),
    legend.title = element_text(size = 10),
    legend.position = "right",
    legend.justification = "top",
    plot.title = element_text(hjust = 0.5, size = 16),  
    plot.margin = margin(10, 10, 10, 10)
  )

shrimp_contact_fig_together

ggsave("./3-figs/shrimp_contact_fig_together.png", plot = shrimp_contact_fig_together, units = "px", width = 2200, height = 1400, dpi = 300)

####2.5.3.3 Plotting control estimates and raw data

shrimp_contact_model_draws <- shrimp_contact_model |> 
  emmeans(~ stroke*stage,
          epred = TRUE,
          rg.limit = 14000,
          re_formula = NA) |> 
  gather_emmeans_draws()

shrimp_contact_raw_data <- final_df |>
  rename(.value = shrimp_contact)

shrimp_contact_model_draws$stage <- factor(shrimp_contact_model_draws$stage, levels = c("Pre", "During", "Post"))
shrimp_contact_model_draws$stroke <- factor(shrimp_contact_model_draws$stroke, levels = c("control", "4", "2"))

shrimp_contact_control_model_draws <- shrimp_contact_model_draws |> 
  dplyr::filter(stroke == "control")

goby_control_raw_data <- final_df |> 
  dplyr::filter(stroke =="control") |> 
  rename(.value = shrimp_contact)

goby_control_means <- goby_control_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

goby_control_raw_data$stage <- factor(goby_control_raw_data$stage, levels = c("Pre", "During", "Post"))

#assigning a value for the baseline mean
shrimp_contact_model_estimates_control_intercept <- shrimp_contact_model_estimates_control %>%
  dplyr::filter(stage == "Pre") %>%
  pull(.value)

shrimp_contact_fig_control <- ggplot(goby_control_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = shrimp_contact_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = shrimp_contact_model_estimates_control, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = shrimp_contact_model_estimates_control, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = goby_control_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  labs(x="Period relative to treatment",
       y="Proportion of time in contact") +
  theme(legend.position = "none", 
        axis.title.x = element_blank(), 
        axis.text.x = element_text(size = 13),  
        axis.text.y = element_text(size = 13),
        axis.title.y = element_text(size = 16, face = "bold", margin = margin(t = 0, b = 0, l = 0, r = 10)),
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#A3C088", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("Control")+
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#76A34A", "Post" = "#D3D9A7")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#2A330E", "Post" = "#5d634c"))

shrimp_contact_fig_control

####2.5.3.4 Plotting 4-stroke estimates and raw data

shrimp_contact_control_model_draws <- shrimp_contact_model_draws |> 
  dplyr::filter(stroke == "4")

goby_four_raw_data <- final_df |> 
  dplyr::filter(stroke =="4") |> 
  rename(.value = shrimp_contact)

goby_four_raw_data$stage <- factor(goby_four_raw_data$stage, levels = c("Pre", "During", "Post"))

goby_four_means <- goby_four_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

shrimp_contact_fig_four <- ggplot(goby_four_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = shrimp_contact_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = shrimp_contact_model_estimates_four, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = shrimp_contact_model_estimates_four, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = goby_four_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  xlab("Experimental phase relative to noise exposure")+
  theme(legend.position = "none", 
        axis.title.y = element_blank(),  
        axis.text.x = element_text(size = 13),  
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        axis.title.x = element_text(size = 16, face = "bold", margin = margin(t = 15, b = 0, l = 0, r = 0)),
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#F6BC65", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("4-stroke")+
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#F29E00", "Post" = "#F2D5A0")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#805213", "Post" = "#70532b"))

shrimp_contact_fig_four

####2.5.3.5 Plotting 2-stroke estimates and raw data

shrimp_contact_control_model_draws <- shrimp_contact_model_draws |> 
  dplyr::filter(stroke == "2")

goby_two_raw_data <- final_df |> 
  dplyr::filter(stroke =="2") |> 
  rename(.value = shrimp_contact)

goby_two_raw_data$stage <- factor(goby_two_raw_data$stage, levels = c("Pre", "During", "Post"))

goby_two_means <- goby_two_raw_data |> 
  group_by(stage) |> 
  summarise(.value = mean(.value))

shrimp_contact_fig_two <- ggplot(goby_two_raw_data, aes(y = .value, x = stage, fill = stage, color = stage)) +
  geom_half_violin(data = shrimp_contact_control_model_draws, alpha = 0.7, size = 0, side = "r", position = position_nudge(x = 0.2)) +
  geom_jitter(position = position_jitternudge(x = -0.1, width = 0.1, nudge.from = "jittered"), alpha = 0.4, size = 2) +
  geom_crossbar(alpha = 0.6, size = 0.8, data = shrimp_contact_model_estimates_two, aes(ymin = lower.HPD, ymax = upper.HPD), width = 0, position = position_nudge(x = 0.2))+
  geom_point(pch = 23, stroke = 1.2, data = shrimp_contact_model_estimates_two, size = 2, position = position_nudge(x = 0.2)) +
  geom_point(data = goby_two_means, position = position_dodgenudge(width = 0.8, x = -0.1), size = 9, shape = "_") +
  theme(legend.position = "none", 
        axis.title.x = element_blank(),  
        axis.text.x = element_text(size = 13),
        axis.title.y = element_blank(), 
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        plot.title = element_textbox_simple(face = "bold", size = 16, halign = 0.5, linewidth = 0.3, linetype = 1, color = "black", fill = "#EB9063", padding = margin(5, 5, 5, 5)), 
        panel.background = element_rect(fill = "white", colour = "black"),
        plot.background = element_rect(fill = NA, colour = NA))+
  ggtitle("2-stroke") +
  scale_fill_manual(values = c("Pre" = "darkgrey", "During" = "#E25A00", "Post" = "#F2B389")) +
  scale_color_manual(values = c("Pre" = "#242424", "During" = "#542709", "Post" = "#66422a"))

shrimp_contact_fig_two

####2.5.3.6 Combining plots into one figure

shrimp_contact_plot3 <- shrimp_contact_fig_control + shrimp_contact_fig_four + shrimp_contact_fig_two + 
  plot_layout(ncol = 3)

shrimp_contact_plot3

ggsave("./3-figs/shrimp_contact_plot3.jpeg", plot = shrimp_contact_plot3, units = "px", width = 2200, height = 1400, dpi = 300)

###2.5.4 Modelling the effect of covariates on the proportion of time spent in contact ####2.5.4.1 Goby number

shrimp_contact_goby_number_contrasts <- shrimp_contact_model |>
  emmeans(~ goby_number, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

shrimp_contact_goby_number_contrasts
##  contrast                    estimate lower.HPD upper.HPD
##  goby_number2 - goby_number1   0.0147   -0.0847     0.109
## 
## Results are averaged over the levels of: stroke, stage, shrimp_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95

####2.5.4.2 Shrimp number

shrimp_contact_shrimp_number_contrasts <- shrimp_contact_model |>
  emmeans(~ shrimp_number, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

shrimp_contact_shrimp_number_contrasts
##  contrast                        estimate lower.HPD upper.HPD
##  shrimp_number2 - shrimp_number1  -0.0534    -0.152    0.0425
##  shrimp_number3 - shrimp_number1  -0.0867    -0.336    0.1326
##  shrimp_number3 - shrimp_number2  -0.0343    -0.270    0.1739
## 
## Results are averaged over the levels of: stroke, stage, goby_number, shrimp_species 
## Point estimate displayed: median 
## HPD interval probability: 0.95

####2.5.4.2 Shrimp species

shrimp_contact_shrimp_species_contrasts <- shrimp_contact_model |>
  emmeans(~ shrimp_species, 
          epred = TRUE,
          re_formla = NULL,
          rg.limit =14000) |> 
  contrast(method = "revpairwise") 

shrimp_contact_shrimp_species_contrasts
##  contrast               estimate lower.HPD upper.HPD
##  mannarensis - bellulus   0.0115    -0.147    0.1861
##  sciolii - bellulus      -0.1492    -0.377    0.0839
##  sciolii - mannarensis   -0.1635    -0.343    0.0107
##  unknown - bellulus      -0.0504    -0.235    0.1429
##  unknown - mannarensis   -0.0625    -0.170    0.0338
##  unknown - sciolii        0.1002    -0.080    0.2967
## 
## Results are averaged over the levels of: stroke, stage, shrimp_number, goby_number 
## Point estimate displayed: median 
## HPD interval probability: 0.95

#3 Manuscript output files ##3.1 Supp tables ###3.1.1 Model estimates

goby_out_model_estimates <- goby_out_model_estimates |> 
  mutate(`Behavioural measure` = "Proportion of time gobies spent outside of the burrow")
  
shrimp_out_model_estimates <- shrimp_out_model_estimates |> 
  mutate(`Behavioural measure` = "Proportion of time shrimp spent outside of the burrow")
  
shrimp_contact_model_estimates <- shrimp_contact_model_estimates |> 
  mutate(`Behavioural measure` = "Proportion of time shrimp spent in contact with a goby")
  
model_estimates <- bind_rows(goby_out_model_estimates, 
                             shrimp_out_model_estimates, 
                             shrimp_contact_model_estimates)

model_estimates <- model_estimates |>
  mutate(stroke = ifelse(stroke == "4", "4-stroke", ifelse(stroke == "2", "2-stroke", "control")),
         stroke = factor(stroke, levels = c("control", "4-stroke", "2-stroke")),
         stage = factor(stage, levels = c("Pre", "During", "Post")),
         `Behavioural measure` = factor(`Behavioural measure`, levels = c("Proportion of time gobies spent outside of the burrow", "Proportion of time shrimp spent outside of the burrow", "Proportion of time shrimp spent in contact with a goby"))) |>
  arrange(`Behavioural measure`, stage, stroke) |> 
  rename(`Estimated marginal mean` = emmean,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Phase = stage,
         `Noise exposure` = stroke) |> 
  select(c(`Behavioural measure`, Phase, `Noise exposure`, `Estimated marginal mean`, `Lower 95% CrI`, `Upper 95% CrI`))

write_csv(model_estimates, "./2-data/model_estimates.csv")

###3.1.2 Pairwise contrasts

#goby out
goby_out_contrasts <- goby_out_results.table |> 
  mutate(`Predictor variable` = "Treatment and phase interaction",
         contrast = str_replace_all(contrast, "\\b2\\b", "2-Stroke"),
         contrast = str_replace_all(contrast, "\\b4\\b", "4-Stroke"),
         contrast = str_replace_all(contrast, "\\bcontrol\\b", "Control")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

goby_out_goby_number1 <- goby_out_goby_number |>
  as.data.frame() |> 
  mutate(`Predictor variable` = "Number of gobies",
         contrast = str_replace_all(contrast, "\\bgoby_number2\\b", "2 gobies"),
         contrast = str_replace_all(contrast, "\\bgoby_number1\\b", "1 goby")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))
  
goby_out_shrimp_number1 <- goby_out_shrimp_number |> 
  as.data.frame() |> 
  mutate(`Predictor variable` = "Number of shrimp",
         contrast = str_replace_all(contrast, "\\bshrimp_number2\\b", "2 shrimp"),
         contrast = str_replace_all(contrast, "\\bshrimp_number1\\b", "1 shrimp"),
         contrast = str_replace_all(contrast, "\\bshrimp_number3\\b", "3 shrimp")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

goby_out_shrimp_species1 <- goby_out_shrimp_species |> 
  as.data.frame() |> 
  mutate(`Predictor variable` = "Shrimp species"
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

goby_out_contrasts_table <- rbind(goby_out_contrasts, goby_out_goby_number1, goby_out_shrimp_number1, goby_out_shrimp_species1) |>
  mutate(
    `Estimated marginal difference` = round(`Estimated marginal difference`, 3),
    `Lower 95% CrI` = round(`Lower 95% CrI`, 3),
    `Upper 95% CrI` = round(`Upper 95% CrI`, 3)
  )

write_csv(goby_out_contrasts_table, "./2-data/goby_out_contrasts_table.csv")

#shrimp out
shrimp_out_contrasts1 <- shrimp_out_contrasts |> 
  mutate(`Predictor variable` = "Treatment and phase interaction",
         contrast = str_replace_all(contrast, "\\b2\\b", "2-Stroke"),
         contrast = str_replace_all(contrast, "\\b4\\b", "4-Stroke"),
         contrast = str_replace_all(contrast, "\\bcontrol\\b", "Control")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

shrimp_out_goby_number_contrasts1 <- shrimp_out_goby_number_contrasts |>
  as.data.frame() |> 
  mutate(`Predictor variable` = "Number of gobies",
         contrast = str_replace_all(contrast, "\\bgoby_number2\\b", "2 gobies"),
         contrast = str_replace_all(contrast, "\\bgoby_number1\\b", "1 goby")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))
  
shrimp_out_shrimp_number_contrasts1 <- shrimp_out_shrimp_number_contrasts |> 
  as.data.frame() |> 
  mutate(`Predictor variable` = "Number of shrimp",
         contrast = str_replace_all(contrast, "\\bshrimp_number2\\b", "2 shrimp"),
         contrast = str_replace_all(contrast, "\\bshrimp_number1\\b", "1 shrimp"),
         contrast = str_replace_all(contrast, "\\bshrimp_number3\\b", "3 shrimp")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

shrimp_out_shrimp_species_contrasts1 <- shrimp_out_shrimp_species_contrasts |> 
  as.data.frame() |> 
  mutate(`Predictor variable` = "Shrimp species"
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

shrimp_out_contrasts_table <- rbind(shrimp_out_contrasts1, shrimp_out_goby_number_contrasts1, shrimp_out_shrimp_number_contrasts1, shrimp_out_shrimp_species_contrasts1) |>
  mutate(
    `Estimated marginal difference` = round(`Estimated marginal difference`, 3),
    `Lower 95% CrI` = round(`Lower 95% CrI`, 3),
    `Upper 95% CrI` = round(`Upper 95% CrI`, 3)
  )

write_csv(shrimp_out_contrasts_table, "./2-data/shrimp_out_contrasts_table.csv")

#shrimp contact
shrimp_contact_contrasts1 <- shrimp_contact_contrasts |> 
  mutate(`Predictor variable` = "Treatment and phase interaction",
         contrast = str_replace_all(contrast, "\\b2\\b", "2-Stroke"),
         contrast = str_replace_all(contrast, "\\b4\\b", "4-Stroke"),
         contrast = str_replace_all(contrast, "\\bcontrol\\b", "Control")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

shrimp_contact_goby_number_contrasts1 <- shrimp_contact_goby_number_contrasts |>
  as.data.frame() |> 
  mutate(`Predictor variable` = "Number of gobies",
         contrast = str_replace_all(contrast, "\\bgoby_number2\\b", "2 gobies"),
         contrast = str_replace_all(contrast, "\\bgoby_number1\\b", "1 goby")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

shrimp_contact_shrimp_number_contrasts1 <- shrimp_contact_shrimp_number_contrasts |> 
  as.data.frame() |> 
  mutate(`Predictor variable` = "Number of shrimp",
         contrast = str_replace_all(contrast, "\\bshrimp_number2\\b", "2 shrimp"),
         contrast = str_replace_all(contrast, "\\bshrimp_number1\\b", "1 shrimp"),
         contrast = str_replace_all(contrast, "\\bshrimp_number3\\b", "3 shrimp")
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

shrimp_contact_shrimp_species_contrasts1 <- shrimp_contact_shrimp_species_contrasts |> 
  as.data.frame() |> 
  mutate(`Predictor variable` = "Shrimp species"
         ) |> 
  rename(`Estimated marginal difference` = estimate,
         `Lower 95% CrI` = lower.HPD,
         `Upper 95% CrI` = upper.HPD,
         Contrast = contrast) |> 
  select(c(`Predictor variable`, Contrast, `Estimated marginal difference`, `Lower 95% CrI`, `Upper 95% CrI`))

shrimp_contact_contrasts_table <- rbind(shrimp_contact_contrasts1, shrimp_contact_goby_number_contrasts1, shrimp_contact_shrimp_number_contrasts1, shrimp_contact_shrimp_species_contrasts1) |>
  mutate(
    `Estimated marginal difference` = round(`Estimated marginal difference`, 3),
    `Lower 95% CrI` = round(`Lower 95% CrI`, 3),
    `Upper 95% CrI` = round(`Upper 95% CrI`, 3)
  )

write_csv(shrimp_contact_contrasts_table, "./2-data/shrimp_contact_contrasts_table.csv")
table_S1 <- final_df %>%
  select(c("burrow", "stroke", "site")) |> 
  unique() |> 
  group_by(site, stroke) %>%
  summarise(n = n(), .groups = "drop") %>%
  pivot_wider(names_from = stroke, values_from = n, values_fill = 0) %>%
  mutate(Total = `control` + `4` + `2`) %>%
  arrange(site) %>%
  rename(`4-stroke` = `4`, 
         `2-stroke` = `2`, 
         Control = control)
LS0tCnRpdGxlOiAic2hyaW1wX2dvYnlfYm9hdG5vaXNlIgphdXRob3I6ICJKYWNrIEwgTWFuZXJhICYgSmFrZSBNIE1hcnRpbiIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIgJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBkZXB0aDogNAogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6ICBjb3NtbwogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICB0b2NfZGVwdGg6IDQKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CiNrbml0ZXIgc2V0dGluZwprbml0cjo6b3B0c19jaHVuayRzZXQoCm1lc3NhZ2UgPSBGQUxTRSwKd2FybmluZyA9IEZBTFNFLCAjIG5vIHdhcm5pbmdzCmNhY2hlID0gVFJVRSwjIENhY2hlaW5nIHRvIHNhdmUgdGltZSB3aGVuIGtuaXRpbmcKdGlkeSA9IFRSVUUKKQpgYGAKCiMxLiBEYXRhIHdyYW5nbGluZwojIzEuMSBMb2FkaW5nIHRoZSByZXF1aXJlZCBwYWNrYWdlcwpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CiNpbnN0YWxsLnBhY2thZ2VzKCJwYWNtYW4iKQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsIGdncGxvdDIsIGJybXMsIGNtZHN0YW5yLCBicm9vbSwgYnJvb20ubWl4ZWQsIHRpZHliYXllcywgZ2d0aGVtZXMsIGVtbWVhbnMsIGdnZGlzdCwgZ3JpZEV4dHJhLCBiYXllc3Bsb3QsIHNlZSwgcGF0Y2h3b3JrLCBnZ3RleHQsIGV4dHJhRGlzdHIsIGdnaGFsdmVzLCBnZ3BwLCByc3RhbikgCgojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInN0YW4tZGV2L2xvbyIpCiMgU2V0dGluZyBjb2xvdXJzIGZvciB2aWRzYWxpc2F0aW9ucwpjb2xvdXIxIDwtICIjOTdBMjc1Igpjb2xvdXIyIDwtICIjRjJCMjNBIgpjb2xvdXIzIDwtICIjRjI3MTFCIgpjb2xvdXI0IDwtICIjOENCRUIyIgpjb2xvdXI1IDwtICIjRTdDMjdEIgpjb2xvdXI2IDwtICIjRjJBNzc1Igpjb2xvdXIxMSA8LSAiIzY2NkU0RiIKY29sb3VyMTIgPC0gIiNBMzgzNDYiCmNvbG91cjEzIDwtICIjOUM0ODExIgpgYGAKCiMjMS4yIFVuYmxpbmRpbmcgdGhlIGRhdGEKYGBge3J9CiNhc3NpZ25pbmcgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHRoZSBjb2RlIGNhbiBiZSB1bml2ZXJzYWxseSByZWFkIG9uIGFueSBjb21wdXRlciBhcyBsb25nIGFzIHRoZSBlbnRpcmUgcHJvamVjdCBmaWxlIGlzIHNoYXJlZApkaXJlY3RvcnkgPC0gJy4vMi1kYXRhLycKCiNyZWFkaW5nIGluIHRoZSBjb2RlZCByYXcgQk9SSVMgb3V0cHV0CkJPUklTX291dHB1dCA8LSByZWFkLmNzdigiLi8yLWRhdGEvQk9SSVNfb3V0cHV0LmNzdiIpCgojcmVhZGluZyBpbiB0aGUgZGVjb2RlcgpWaWRlb19jb2RlcyA8LSByZWFkLmNzdigiLi8yLWRhdGEvVmlkZW9fY29kZXMuY3N2IikKCiNyZWFkaW5nIGluIHNocmltcCBzcGVjaWVzIGluZm9ybWF0aW9uCnNocmltcF9zcGVjaWVzIDwtIHJlYWQuY3N2KCIuLzItZGF0YS9zcGVjaWVzLmNzdiIpCgojYmluZGluZyB0aGUgZGVjb2RlciB0byB0aGUgQk9SSVMgb3V0cHV0IGFuZCByZXZlYWxpbmcgdGhlIHRyZWF0bWVudCBhbmQgc3RhZ2UKQk9SSVNfb3V0cHV0JGNvZGUgPC0gc3RyX3N1YihCT1JJU19vdXRwdXQkdmlkZW9faWQsIDIsKQpCT1JJU19vdXRwdXQkY29kZSA8LSBhcy5mYWN0b3IoQk9SSVNfb3V0cHV0JGNvZGUpCnNocmltcF9zcGVjaWVzJGNvZGUgPC0gYXMuZmFjdG9yKHNocmltcF9zcGVjaWVzJGNvZGUpClZpZGVvX2NvZGVzJGNvZGUgPC0gYXMuZmFjdG9yKFZpZGVvX2NvZGVzJGNvZGUpCmRlY29kZWRfZGF0YWZyYW1lIDwtIGlubmVyX2pvaW4oaW5uZXJfam9pbihCT1JJU19vdXRwdXQsIFZpZGVvX2NvZGVzLCBieSA9IGMoImNvZGUiKSksIHNocmltcF9zcGVjaWVzLCBieSA9IGMoImNvZGUiKSkKYGBgCgojIyAxLjMgQ3Jvc3MtY2hlY2tpbmcgdGhlIGltcG9ydGVkIGRhdGFzZXRzCmBgYHtyfQojIEZpbmQgY29tbW9uIGNvZGVzIGFjcm9zcyBhbGwgZGF0YSBzZXRzCmNvbW1vbl9jb2RlcyA8LSBSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KEJPUklTX291dHB1dCRjb2RlLCBzaHJpbXBfc3BlY2llcyRjb2RlLCBWaWRlb19jb2RlcyRjb2RlKSkKCiMgQ29tYmluZSBhbGwgY29kZXMgZnJvbSB0aGUgdGhyZWUgZGF0YSBzZXRzCmFsbF9jb2RlcyA8LSB1bmlxdWUoYyhCT1JJU19vdXRwdXQkY29kZSwgc2hyaW1wX3NwZWNpZXMkY29kZSwgVmlkZW9fY29kZXMkY29kZSkpCgojIEZpbmQgY29kZXMgbm90IGNvbW1vbiBhY3Jvc3MgYWxsIGRhdGEgc2V0cwpjb2Rlc19ub3RfY29tbW9uIDwtIHNldGRpZmYoYWxsX2NvZGVzLCBjb21tb25fY29kZXMpCgojIERlZmluZSBhIGZ1bmN0aW9uIHRvIGNoZWNrIHdoaWNoIGRhdGEgc2V0cyBjb250YWluIGVhY2ggY29kZQpjaGVja19jb2RlX29yaWdpbiA8LSBmdW5jdGlvbihjb2RlKSB7CiAgb3JpZ2lucyA8LSBjKCkKCiAgaWYoY29kZSAlaW4lIEJPUklTX291dHB1dCRjb2RlKSB7CiAgICBvcmlnaW5zIDwtIGMob3JpZ2lucywgIkJPUklTX291dHB1dCIpCiAgfQogIGlmKGNvZGUgJWluJSBzaHJpbXBfc3BlY2llcyRjb2RlKSB7CiAgICBvcmlnaW5zIDwtIGMob3JpZ2lucywgInNocmltcF9zcGVjaWVzIikKICB9CiAgaWYoY29kZSAlaW4lIFZpZGVvX2NvZGVzJGNvZGUpIHsKICAgIG9yaWdpbnMgPC0gYyhvcmlnaW5zLCAiVmlkZW9fY29kZXMiKQogIH0KCiAgcmV0dXJuKHBhc3RlKG9yaWdpbnMsIGNvbGxhcHNlPSIsICIpKQp9CgojIENyZWF0ZSBhIGRhdGFmcmFtZSB0byBzdG9yZSB0aGUgcmVzdWx0cwpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoY29kZSA9IGNoYXJhY3RlcigwKSwgb3JpZ2luID0gY2hhcmFjdGVyKDApLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgojIExvb3AgdGhyb3VnaCBlYWNoIGNvZGUgbm90IGNvbW1vbiBhY3Jvc3MgYWxsIGRhdGEgc2V0cwpmb3IoY29kZSBpbiBjb2Rlc19ub3RfY29tbW9uKSB7CiAgb3JpZ2luIDwtIGNoZWNrX2NvZGVfb3JpZ2luKGNvZGUpCiAgcmVzdWx0cyA8LSByYmluZChyZXN1bHRzLCBkYXRhLmZyYW1lKGNvZGUgPSBhcy5jaGFyYWN0ZXIoY29kZSksIG9yaWdpbiA9IG9yaWdpbiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSkKfQoKIyBQcmludCB0aGUgcmVzdWx0cwpwcmludChyZXN1bHRzKQoKIyBNaXNzaW5nIG9ic2VydmF0aW9ucyBhcmUgaWRlbnRpZmllZCBleGNsdXNpdmVseSB3aXRoaW4gdGhlICdWaWRlb19jb2RlcycgZGF0YWZyYW1lLiBUaGlzIHNpdHVhdGlvbiBzdWdnZXN0cyB0aGF0IGFsbCB2aWRlb3MgY2FwdHVyaW5nIGJvdGggc2hyaW1wIGFuZCBnb2JpZXMgYXJlIGNvbnNpc3RlbnRseSByZXByZXNlbnRlZCBhY3Jvc3MgdGhlIGRhdGFzZXRzLiBIb3dldmVyLCB0aGVyZSB3ZXJlIGluc3RhbmNlcyB3aGVyZSBidXJyb3dzIHdlcmUgcmVjb3JkZWQgYW5kIGFzc2lnbmVkIHZpZGVvIGNvZGVzIGJ1dCBzaG93ZWQgbm8gYWN0aXZpdHkgZnJvbSBnb2JpZXMgb3Igc2hyaW1wIGR1cmluZyB0aGVzZSByZWNvcmRpbmdzLiBUaGVzZSBpbnN0YW5jZXMgbGVkIHRvIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3VjaCBidXJyb3dzIHdlcmUgaW5hY3RpdmUsIHJlc3VsdGluZyBpbiB0aGVpciBleGNsdXNpb24gZnJvbSB0aGUgZnVydGhlciBhbmFseXNpcyBvZiB0aGUgc3R1ZHkuCmBgYAoKIyMxLjQgQ2xlYW5pbmcgdGhlIGRhdGFmcmFtZQojIyMxLjQuMSBDb2x1bW4gcmVuYW1pbmcKYGBge3J9CmRlY29kZWRfZGF0YWZyYW1lIDwtIGRlY29kZWRfZGF0YWZyYW1lIHw+IAogIHJlbmFtZShzaHJpbXBfc3BlY2llcyA9IHNwZWNpZXMpCgojcmVuYW1pbmcgc29tZSBvZiB0aGUgdmFyaWFibGVzIGFuZCBleHRyYWN0aW5nIGluZGl2aWR1YWwgdmFyaWFibGVzIGZyb20gY29sdW1ucyB0aGF0IGhhdmUgbXVsdGlwbGUgdmFyaWFibGVzIGNvbnRhaW5lZCBpbiBvbmUgc3RyaW5nCmRlY29kZWRfZGF0YWZyYW1lIDwtIGRlY29kZWRfZGF0YWZyYW1lIHw+IAogIGRwbHlyOjpyZW5hbWUoc3RhZ2UgPSB2aWRlb19zZWN0aW9uLAogICAgICAgICAgICAgICAgZHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbl9zLAogICAgICAgICAgICAgICAgYmVoYXZpb3VyID0gYmVoYXZpb3IpIHw+CiAgZHBseXI6Om11dGF0ZShkYXRlID0gc3RyX3N1YihkYXRlX2ZpbGUsICwgNiksCiAgICAgICAgICAgICAgICBzcGVjaWVzID0gc3RyX3N1YihzdWJqZWN0LCA1LCksCiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGFzLm51bWVyaWMoZHVyYXRpb24pLAogICAgICAgICAgICAgICAgYm9hdF9pZCA9IHN0cl9zdWIoZGF0ZV9maWxlLCAtMSwgLTEpLAogICAgICAgICAgICAgICAgdmlkZW9fbnVtID0gYXMubnVtZXJpYyhzdHJfc3ViKHZpZGVvX2lkLCAyKSksCiAgICAgICAgICAgICAgICBidXJyb3cgPSBjZWlsaW5nKHZpZGVvX251bS8zKSwKICAgICAgICAgICAgICAgIGluZGl2aWR1YWwgPSBzdHJfc3ViKHN1YmplY3QsIDEsIDEpLAogICAgICAgICAgICAgICAgc3Ryb2tlID0gZmFjdG9yKHN0cm9rZSksCiAgICAgICAgICAgICAgICBib2F0X25hbWUgPSBmYWN0b3IoYm9hdF9uYW1lKQogICAgICAgICAgICAgICAgKQoKI2NyZWF0aW5nIHNvbWUgdW5pcXVlIGlkZW50aWZpZXJzIHRvIG1ha2UgZ3JvdXBpbmcgZWFzaWVyIGxhdGVyIG9uIGZvciByZW9yZ2FuaXNpbmcgb2YgdGhlIGRhdGFmcmFtZQpkZWNvZGVkX2RhdGFmcmFtZSA8LSBkZWNvZGVkX2RhdGFmcmFtZSB8PiAKICB1bml0ZSgidW5pcXVlX2lkIiwgJ2J1cnJvdycsJ2luZGl2aWR1YWwnLCAnc3BlY2llcycsICdzdGFnZScsIHJlbW92ZSA9IEZBTFNFKSB8PiAKICB1bml0ZSgiYnVycm93X3NwZWNpZXNfc3RhZ2UiLCAnYnVycm93JywgJ3NwZWNpZXMnLCAnc3RhZ2UnLCByZW1vdmUgPSBGQUxTRSkgfD4gCiAgdW5pdGUoImJ1cnJvd19zcGVjaWVzIiwgJ2J1cnJvdycsICdzcGVjaWVzJywgcmVtb3ZlID0gRkFMU0UpCmBgYAoKIyMjMS40LjIgUmVtb3ZpbmcgcmVkdW5kYW50IEJPUklTIGVudHJpZXMKYGBge3J9CiN0aGUgbmV4dCBmZXcgbGluZXMgb2YgY29kZSBhcmUgdG8gZG8gd2l0aCB0aGUgd2F5IEJPUklTIG91dHB1dHMgZGF0YSwgd2hlcmUgdGhlcmUgd2FzIHJlZHVuZGFudCBlbXB0eSBzZWN0aW9ucyBkdWUgdG8gYm90aCBzcGVjaWVzIGJlaW5nIGluZGVwZW5kZW50bHkgc2NvcmVkIGluIHRoZSBzb2Z0d2FyZS4gU28gaGVyZSB3ZSBhcmUgZmlsdGVyaW5nIG91dCB0aGUgc3BlY2llcyBzcGVjaWZpYyBkYXRhIGZyb20gdGhlIGNvcnJlbGF0aW5nIEJPUklTIHNwZWNpZXMgb2JzZXJ2YXRpb24gYW5kIHRoZW4gcmViaW5kaW5nIHRoZSBkYXRhIHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVtcHR5IGFydGlmYWN0IGVudHJpZXMuIAoKI2V4dHJhY3RpbmcganVzdCB0aGUgZ29ieSBkYXRhIHNvIHRoYXQgYSBzcGVjaWVzIHZhcmlhYmxlIGNhbiBiZSBtYWRlCmdvYnlfZGF0YWZyYW1lIDwtIGRlY29kZWRfZGF0YWZyYW1lIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3BlY2llcyA9PSAiR29ieSIpIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3RyX2RldGVjdCh2aWRlb19pZCwgJ2cnKSkKCiNleHRyYWN0aW5nIGp1c3QgdGhlIHNocmltcCBkYXRhIHNvIHRoYXQgYSBzcGVjaWVzIHZhcmlhYmxlIGNhbiBiZSBtYWRlCnNocmltcF9kYXRhZnJhbWUgPC0gZGVjb2RlZF9kYXRhZnJhbWUgfD4gCiAgZHBseXI6OmZpbHRlcihzcGVjaWVzID09ICJTaHJpbXAiKSAgfD4gIAogIGRwbHlyOjpmaWx0ZXIoc3RyX2RldGVjdCh2aWRlb19pZCwgJ2onKSkKCiNiaW5kaW5nIHRoZSB0d28gc3BlY2llcyBzcGVjaWZpYyBkYXRhIGZyYW1lcyBiYWNrIHRvZ2V0aGVyIHNvIHRoYXQgdGhlcmUgaXMgbm93IG5vIGVtcHR5IAp3b3JraW5nZGYxIDwtIGJpbmRfcm93cyhnb2J5X2RhdGFmcmFtZSwgc2hyaW1wX2RhdGFmcmFtZSkgCgojZmlsdGVyaW5nIGZvciB0aGUgYmVodmlvdXJzIG9mIGludGVyZXN0IHRvIHRoaXMgZXhwZXJpbWVudAp3b3JraW5nZGYyIDwtIHdvcmtpbmdkZjEgfD4gCiAgZ3JvdXBfYnkodW5pcXVlX2lkKSB8PiAKICBkcGx5cjo6ZmlsdGVyKGJlaGF2aW91ciA9PSAnSU5TSURFJyB8IGJlaGF2aW91ciA9PSAnRURHRScgfCBiZWhhdmlvdXIgPT0gJ05FQVInIHwgYmVoYXZpb3VyID09ICdBV0FZJyB8YmVoYXZpb3VyID09ICdDT05UQUNUJyB8YmVoYXZpb3VyID09ICdBUEFSVCcgKSB8PgogIG11dGF0ZShhdmVyYWdlZHVyYXRpb24gPSBzdW0oZHVyYXRpb24pKQoKI2JlY3Vhc2Ugb2YgdGhlIHdheSBCT1JJUyBvdXRwdXRzIGRhdGEgdGhlcmUgYXJlIHJlZHVuZGFudCBpbmRpdmlkdWFscyBpbiB0aGUgZGF0YSwgZS5nLiwgZXZlbiBpZiB0aGVyZSBhcmUgb25seSB0d28gc2hyaW1wIGluIGEgYnVycm93IHRoZW4gQk9SSVMgd2lsbCBzdGlsbCBvdXRwdXQgb2JzZXJ2YXRpb25zIGZvciBhIHRoaXJkIHNocmltcCBhbmQgYWxsIHZhbHVlIHdpbGwgYmUgMCdzLiB0aGlzIGlzIHdoYXQgdGhpcyBzZWN0aW9uIG9mIGNvZGUgaXMgcmVtb3ZpbmcKd29ya2luZ2RmMyA8LSB3b3JraW5nZGYyIHw+IAogIGdyb3VwX2J5KGJ1cnJvdywgc3BlY2llcywgaW5kaXZpZHVhbCkgfD4gCiAgZHBseXI6OmZpbHRlcihzdW0oYXZlcmFnZWR1cmF0aW9uKSAhPSAwKQpgYGAKCiMjIzEuNC4zIEFzc2lnbmluZyB2YWx1ZXMgdG8gbWlzc2luZyBlbnRyaWVzCmBgYHtyfQojbm93IGhlcmUgd2UgYXJlIG1ha2luZyB0aGUgYXNzdW1wdGlvbiB0aGF0IHdoZW4gYSBnb2J5IG9yIHNocmltcCBpcyBwcmVzZW50IGluIG90aGVyIHZpZGVvcyBidXQgbWlzc2luZyBmcm9tIHRoZSB2aWRlbyBvZiBmb2N1cyBpdCBpcyBlaXRoZXIgYXdheSBhbmQgb3V0IG9mIGZyYW1lIGZvciB0aGUgZW50aXJlIHRyaWFsIGlmIGl0IGlzIGEgZ29ieS4gT3RoZXJ3aXNlIGl0IGlzIGluc2lkZSB0aGUgYnVycm93IHRoZSBlbnRpcmUgdGltZSBpZiBpdCBpcyBhIHNocmltcC4gVGhlc2UgYXNzdW1wdGlvbnMgYXJlIGJhc2VkIG9mZiBvZiBwcmVsaW1pbmFyeSBvYnNlcnZhdGlvbiBhbmQgdGhlIGdlbmVyYWwgdGVuZGVuY2llcyBvZiBlYWNoIHNwZWNpZXMuIEJlY2F1c2Ugb2YgdGhpcyBhc3N1bXB0aW9uIHdlIGFyZSBhc3NpZ25pbmcgdGhlIHJlc3BlY3RpdmUgdmFsdWUgdG8gdGhlIGJlaHZpb3VyIGluIGNhc2VzIHdoZXJlIG9uZSBvZiB0aGUgc3BlY2llcyBpcyBrbm93biB0byBiZSBwcmVzZW50IGluIGEgYnVycm93IGJ1dCBub3Qgdmlld2VkIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSB0cmlhbC4gCmZpeGVkZGYxIDwtIHdvcmtpbmdkZjMgfD4gCiAgZHBseXI6OmZpbHRlcihhdmVyYWdlZHVyYXRpb24gPT0gMCkgfD4gCiAgbXV0YXRlKGR1cmF0aW9uID0gaWZlbHNlKHNwZWNpZXMgPT0gIkdvYnkiICYgYmVoYXZpb3VyID09ICJBV0FZIiwgMzAwLCBkdXJhdGlvbiksCiAgICAgICAgIGR1cmF0aW9uID0gaWZlbHNlKHNwZWNpZXMgPT0gIlNocmltcCIgJiBiZWhhdmlvdXIgPT0gIklOU0lERSIsIDMwMCwgZHVyYXRpb24pCiAgICAgICAgICkKCmZpeGVkZGYyIDwtIHdvcmtpbmdkZjMgfD4gCiAgZHBseXI6OmZpbHRlcihhdmVyYWdlZHVyYXRpb24gIT0gMCkKCndvcmtpbmdkZjQgPC0gcmJpbmQoZml4ZWRkZjIsIGZpeGVkZGYxKSB8PiAKICBncm91cF9ieShidXJyb3dfc3BlY2llcykgfD4gCiAgZHBseXI6Om11dGF0ZShudW1iZXJfY29uc3BlY2lmaWNzID0gbWF4KGFzLmludGVnZXIoaW5kaXZpZHVhbCkpKSB8PiAKICB1bmdyb3VwKCkKCiNub3cgdXNpbmcgdGhlIG51bWJlciBvZiBjb25zcGVjaWZpY3MgdG8gY2FsY3VsYXRlIGEgZHVyYXRpb24gdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBtZWFuIHRpbWUgc3BlbnQgZG9pbmcgdGhhdCBhY3Rpdml0eSBmb3IgdGhhdCBzcGVjaWVzIChpLmUuIGdvYnkgb3Igc2hyaW1wKSBpbiB0aGF0IGJ1cnJvdyBhcyB3ZSBhcmUgdW4gYWJsZSB0byBwcmVzZXJ2ZSBpZGVudGl0eSBhbmQgdGh1cyBpbnN0ZWFkIG11c3QgbG9vayBhdCBzcGVjaWVzIGF2ZXJhZ2VzIGZvciBlYWNoIGJlaGF2aW91ci4gCndvcmtpbmdkZjUgPC0gd29ya2luZ2RmNCB8PiAKICBncm91cF9ieShidXJyb3dfc3BlY2llcywgYmVoYXZpb3VyLCBzdGFnZSkgfD4gCiAgZHBseXI6Om11dGF0ZShtZWFuX2R1cmF0aW9uID0gbWVhbihkdXJhdGlvbikpIHw+IAogIHVuZ3JvdXAoKSB8PiAKICBkcGx5cjo6ZmlsdGVyKGluZGl2aWR1YWwgPT0gMSkgCgojdHJhbnNmb3JtaW5nIHRoZSBkYXRhIGZyYW1lIGludG8gd2lkZSBmb3JtYXQgYW5kIHR1cm5pbmcgdGltZSBzcGVudCBpbiBlYWNoIHpvbmUgaW50byBhIHByb3BvcnRpb24gb2YgdGhlIHRvdGFsIHRpbWUgKGkuZS4gYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEpCndpZGVfZGF0YSA8LSB3b3JraW5nZGY1IHw+CiAgcGl2b3Rfd2lkZXIoCiAgICBpZF9jb2xzID0gYyhidXJyb3dfc3BlY2llcywgYnVycm93X3NwZWNpZXNfc3RhZ2UsIGJ1cnJvdywgc3RhZ2UsIHNwZWNpZXMsIGJvYXRfaWQsIHN0cm9rZSwgc2l0ZSwgbnVtYmVyX2NvbnNwZWNpZmljcywgc2hyaW1wX3NwZWNpZXMpLAogICAgbmFtZXNfZnJvbSA9IGJlaGF2aW91ciwKICAgIHZhbHVlc19mcm9tID0gbWVhbl9kdXJhdGlvbgogICkKCndpZGVfZGF0YSA8LSB3aWRlX2RhdGEgfD4gCiAgbXV0YXRlKElOU0lERSA9IGFzLm51bWVyaWMoSU5TSURFKSwKICAgICAgICAgRURHRSA9IGFzLm51bWVyaWMoRURHRSksCiAgICAgICAgIE5FQVIgPSBhcy5udW1lcmljKE5FQVIpLAogICAgICAgICBBV0FZID0gYXMubnVtZXJpYyhBV0FZKSwKICAgICAgICAgQ09OVEFDVCA9IGFzLm51bWVyaWMoQ09OVEFDVCksCiAgICAgICAgIEFQQVJUID0gYXMubnVtZXJpYyhBUEFSVCkpIHw+IAogIG11dGF0ZSh0b3RhbCA9IElOU0lERStORUFSK0VER0UrQVdBWSwKICAgICAgICAgaW5zaWRlID0gKElOU0lERSArIEVER0UpLyhJTlNJREUrRURHRStORUFSK0FXQVkpLCAKICAgICAgICAgYXdheSA9IChORUFSICsgQVdBWSkvKElOU0lERStFREdFK05FQVIrQVdBWSksCiAgICAgICAgIG51bWJlcl9jb25zcGVjaWZpY3MgPSBhcy5mYWN0b3IobnVtYmVyX2NvbnNwZWNpZmljcyksCiAgICAgICAgIHNocmltcF9jb250YWN0ID0gQ09OVEFDVC8oQ09OVEFDVCtBUEFSVCkKICAgICAgICAgKSB8PiAKICBkcGx5cjo6c2VsZWN0KC1JTlNJREUsIC1FREdFLCAtTkVBUiwgLUFXQVksIC1DT05UQUNULCAtQVBBUlQpCgojY2hlY2tpbmcgaWYgZXZlcnkgYnVycm93IGNvbnRhaW5zIG9ic2VydmF0aW9ucyBmb3IgYm90aCAnU2hyaW1wJyBhbmQgJ0dvYnknCmJ1cnJvd192YWx1ZXMgPC0gdW5pcXVlKHdpZGVfZGF0YSRidXJyb3cpIApoYXNfc2hyaW1wIDwtIGJ1cnJvd192YWx1ZXMgJWluJSB3aWRlX2RhdGEkYnVycm93W3dpZGVfZGF0YSRzcGVjaWVzID09ICdTaHJpbXAnXSAKaGFzX2dvYnkgPC0gYnVycm93X3ZhbHVlcyAlaW4lIHdpZGVfZGF0YSRidXJyb3dbd2lkZV9kYXRhJHNwZWNpZXMgPT0gJ0dvYnknXSAKYnVycm93c193aXRob3V0X2JvdGhfc3BlY2llcyA8LSBidXJyb3dfdmFsdWVzWyEoaGFzX3NocmltcCAmIGhhc19nb2J5KV0KY2F0KCJidXJyb3dzIHdpdGhvdXQgYm90aCAnU2hyaW1wJyBhbmQgJ0dvYnknIHNwZWNpZXM6IiwgcGFzdGUoYnVycm93c193aXRob3V0X2JvdGhfc3BlY2llcywgY29sbGFwc2UgPSAnLCAnKSkKCiNyZW1vdmluZyB0aGUgcm93cyB3aXRoIGJ1cnJvd3Mgd2l0aG91dCBib3RoICdTaHJpbXAnIGFuZCAnR29ieScgc3BlY2llcyBmcm9tIHRoZSBkYXRhZnJhbWUKd2lkZV9kYXRhIDwtIHdpZGVfZGF0YVshd2lkZV9kYXRhJGJ1cnJvdyAlaW4lIGJ1cnJvd3Nfd2l0aG91dF9ib3RoX3NwZWNpZXMsIF0KCndpZGVfZGF0YSA8LSB3aWRlX2RhdGEgfD4gCiAgbXV0YXRlKGJ1cnJvdyA9IGFzLmZhY3RvcihidXJyb3cpKQoKI0NoZWNraW5nIHRvIHNlZSB0aGUgY291bnQgb2Ygb2JzZXJ2YXRpb25zIHBlciBidXJyb3cKYnVycm93X2NvdW50cyA8LSB0YWJsZSh3aWRlX2RhdGEkYnVycm93KQpwcmludChidXJyb3dfY291bnRzKQoKI3RoZXJlIGFyZSBzb21lIGJ1cnJvd3MgdGhhdCBhcmUgbWlzc2luZyBzdGFnZXMgZHVlIHRvIHRoZSBhbmltYWwgbm90IGJlaW5nIG9ic2VydmVyZWQgYXQgYWxsIGR1cmluZyB0aGF0IG9ic2VydmF0aW9uIHNvIHdlIHdpbGwgbWFrZSBzb21lIGNvbmRpdGlvbmFsIGFzc3VtcHRpb25zIGFuZCBmaWxsIGluIHRoZSBtaXNzaW5nIHZhbHVlcy4gCgojYSBmdW5jdGlvbiB0byBmaWxsIHRoZSBtaXNzaW5nIHN0YWdlcyBmb3IgZWFjaCBzcGVjaWVzIHdpdGhpbiBlYWNoIGJ1cnJvdwpmaWxsX21pc3Npbmdfc3RhZ2VzIDwtIGZ1bmN0aW9uKGRmKSB7CiAgYWxsX3N0YWdlcyA8LSBjKCdQcmUnLCAnRHVyaW5nJywgJ1Bvc3QnKQogIAogIG1pc3Npbmdfc3RhZ2VzIDwtIHNldGRpZmYoYWxsX3N0YWdlcywgdW5pcXVlKGRmJHN0YWdlKSkKICAKICBpZihsZW5ndGgobWlzc2luZ19zdGFnZXMpID09IDApIHJldHVybihkYXRhLmZyYW1lKCkpCiAgCiAgY29tbW9uX3ZhbHVlcyA8LSBkZlsxLCBdCiAgCiAgbmV3X3Jvd3MgPC0gZGF0YS5mcmFtZSgpCiAgCiAgZm9yKHN0YWdlIGluIG1pc3Npbmdfc3RhZ2VzKSB7CiAgICBuZXdfcm93IDwtIGNvbW1vbl92YWx1ZXMKICAgIG5ld19yb3ckc3RhZ2UgPC0gc3RhZ2UKICAgIAogICAgIyBTZXQgY29sdW1uIHZhbHVlcyBiYXNlZCBvbiBzcGVjaWVzCiAgICBpZihuZXdfcm93JHNwZWNpZXMgPT0gIkdvYnkiKSB7CiAgICAgIG5ld19yb3ckYXdheSA8LSAxCiAgICAgIG5ld19yb3ckaW5zaWRlIDwtIDAKICAgICAgbmV3X3JvdyR0b3RhbCA8LSAzMDAKICAgICAgbmV3X3JvdyRzaHJpbXBfY29udGFjdCA8LSAwCiAgICB9IGVsc2UgaWYobmV3X3JvdyRzcGVjaWVzID09ICJTaHJpbXAiKSB7CiAgICAgIG5ld19yb3ckYXdheSA8LSAwCiAgICAgIG5ld19yb3ckaW5zaWRlIDwtIDEKICAgICAgbmV3X3JvdyR0b3RhbCA8LSAzMDAKICAgICAgbmV3X3JvdyRzaHJpbXBfY29udGFjdCA8LSBOQQogICAgfQogICAgCiAgICBuZXdfcm93cyA8LSByYmluZChuZXdfcm93cywgbmV3X3JvdykKICB9CiAgCiAgcmV0dXJuKG5ld19yb3dzKQp9CgojYXBwbHlpbmcgdGhlIGZ1bmN0aW9uCmZpeGVkZGYzIDwtIHdpZGVfZGF0YSB8PgogIGdyb3VwX2J5KGJ1cnJvd19zcGVjaWVzKSB8PgogIGRvKGZpbGxfbWlzc2luZ19zdGFnZXMoLikpIHw+CiAgdW5ncm91cCgpCgp3aWRlX2RhdGFfZmlsbGVkIDwtIHJiaW5kKHdpZGVfZGF0YSwgZml4ZWRkZjMpCiAgCiNDaGVja2luZyB0byBzZWUgdGhlIGNvdW50IG9mIG9ic2VydmF0aW9ucyBwZXIgYnVycm93CmZpbGxlZF9idXJyb3dfY291bnRzIDwtIHRhYmxlKHdpZGVfZGF0YV9maWxsZWQkYnVycm93KQpwcmludChmaWxsZWRfYnVycm93X2NvdW50cykKYGBgCgojIyMxLjQuNCBDaGFuZ2luZyBkYXRhZnJhbWUgZm9ybWF0IApgYGB7cn0Kd29ya2luZ2RmNyA8LSB3aWRlX2RhdGFfZmlsbGVkIHw+IAogIG11dGF0ZShidXJyb3dfc3RhZ2UgPSBwYXN0ZShidXJyb3csIHN0YWdlKSkKCmdvYnlfZGYgPC0gd29ya2luZ2RmNyB8PiAKICBkcGx5cjo6ZmlsdGVyKHNwZWNpZXMgPT0gIkdvYnkiKSB8PiAKICByZW5hbWUoZ29ieV9vdXQgPSBhd2F5LCBnb2J5X3RvdGFsID0gdG90YWwsIGdvYnlfbnVtYmVyID0gbnVtYmVyX2NvbnNwZWNpZmljcykgfD4gCiAgc2VsZWN0KC1jKCJpbnNpZGUiLCAic3BlY2llcyIsICJidXJyb3dfc3BlY2llcyIsICJidXJyb3dfc3BlY2llc19zdGFnZSIsICJzaHJpbXBfY29udGFjdCIpKQoKc2hyaW1wX2RmIDwtIHdvcmtpbmdkZjcgfD4gCiAgZHBseXI6OmZpbHRlcihzcGVjaWVzID09ICJTaHJpbXAiKSB8PiAKICByZW5hbWUoc2hyaW1wX291dCA9IGF3YXksIHNocmltcF90b3RhbCA9IHRvdGFsLCBzaHJpbXBfbnVtYmVyID0gbnVtYmVyX2NvbnNwZWNpZmljcykgfD4gCiAgc2VsZWN0KGMoInNocmltcF9vdXQiLCAic2hyaW1wX3RvdGFsIiwgInNocmltcF9udW1iZXIiLCAiYnVycm93X3N0YWdlIiwgInNocmltcF9jb250YWN0IikpCgpmaW5hbF9kZiA8LSBpbm5lcl9qb2luKGdvYnlfZGYsIHNocmltcF9kZiwgYnkgPSAiYnVycm93X3N0YWdlIikgfD4gCiAgbXV0YXRlKHNocmltcF9jb250YWN0ID0gaWZlbHNlKGlzLm5hKHNocmltcF9jb250YWN0KSwgaWZlbHNlKGdvYnlfb3V0ID09IDEsIDAsIDEgLSBnb2J5X291dCksIHNocmltcF9jb250YWN0KSkgfD4gCiAgZmlsdGVyKHNpdGUgIT0gIlNJVEUgTyIpCgp3cml0ZV9jc3YoZmluYWxfZGYsICIuLzItZGF0YS9maW5hbF9kZi5jc3YiKQpgYGAKCiMyLiBTdGF0aXN0aWNhbCBhbmFseXNpcyB1c2luZyB6ZXJvLW9uZSBpbmZsYXRlZCBiZXRhIHJlZ3Jlc3Npb24KIyMyLjEgQnVpbGRpbmcgYSBnbG9iYWwgbW9kZWwKYGBge3J9CiNidWlsZGluZyBhIGdsb2JhbCBtb2RlbCBmb3IgdGhlIHByb3BvcnRpb24gb2YgdGltZSBnb2JpZXMgc3BlbnQgb3V0IG9mIHRoZSBidXJyb3cKem9pYl9mb3JtdWxhIDwtIGJmKAogICMgbXUgKG1lYW4pIHBhcnQKICBnb2J5X291dCB+IHN0cm9rZSAqIHN0YWdlICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfbnVtYmVyICsgc2hyaW1wX3NwZWNpZXMgKyAoMSB8IHNpdGUvYnVycm93KSwKICAjIHBoaSAocHJlY2lzaW9uKSBwYXJ0CiAgcGhpIH4gc3Ryb2tlICogc3RhZ2UgKyBnb2J5X251bWJlciArIHNocmltcF9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxIHwgc2l0ZS9idXJyb3cpLAogICMgYWxwaGEgKHplcm8tb25lLWluZmxhdGlvbikgcGFydAogIHpvaSB+IHN0cm9rZSAqIHN0YWdlICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfbnVtYmVyICsgc2hyaW1wX3NwZWNpZXMgKyAoMSB8IHNpdGUvYnVycm93KSwKICAjIFRoZSBvbmUtaW5mbGF0ZWQgcGFydCwgY29uZGl0aW9uYWwgb24gdGhlIDBzCiAgY29pIH4gc3Ryb2tlICogc3RhZ2UgKyBnb2J5X251bWJlciArIHNocmltcF9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxIHwgc2l0ZS9idXJyb3cpLAogIAogIGZhbWlseSA9IHplcm9fb25lX2luZmxhdGVkX2JldGEoKQopCmBgYAoKIyMyLjIgU3BlY2lmeWluZyBwcmlvcnMKIyMjMi4yLjEgQ2hlY2tpbmcgZGVmYXVsdCBwcmlvcnMKYGBge3J9CmdldF9wcmlvcigKICB6b2liX2Zvcm11bGEsCiAgZGF0YSA9IGZpbmFsX2RmCikKI3dlIGNhbiBzZWUgdGhhdCBhbGwgdGhlIGJldGEgY29lZmZpY2llbnRzIGFyZSBiZWluZyBnaXZlbiBhIGZsYXQgcHJpb3Igd2hpY2ggbWVhbnMgaXQgY2FuIHRha2Ugb24gYSB2YWx1ZSBmcm9tIC0gaW5maW5pdHkgdG8gKyBpbmZpbml0eS4gQWxsIHRoZSBiZXRhIGNvZWZmaWNpZW50cyBhcmUgb24gdGhlIGxvZ2l0IHNjYWxlIHNvIGxldHMgcGxvdCBob3cgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGJldGEgcmVsYXRlcyB0byBkaWZmZXJlbnQgcHJvcG9ydGlvbnMKYGBgCgojIyMyLjIuMiBHcmFwaGluZyBsb2dpdH5wcm9wb3J0aW9uCmBgYHtyfQp0aWJibGUoeCA9IHNlcSgtOCwgOCwgYnkgPSAwLjEpKSB8PiAKICBtdXRhdGUoeSA9IHBsb2dpcyh4KSkgfD4gCiAgZ2dwbG90KGFlcyh4ID0geCwgeSA9IHkpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgbGFicyh4ID0gIkxvZ2l0IHNjYWxlIiwgeSA9ICJQcm9iYWJpbGl0eSBzY2FsZSIpCgojd2UgY2FuIHNlZSB0aGF0IGFmdGVyIC01IG9yICs1IHRoZSBwcm9iYWJpbGl0eSBkb2Vzbid0IGNoYW5nZSBtdWNoLCBpbnN0ZWFkIG9mIGxlYXZpbmcgb3VyIHByaW9ycyBhdCB0aGUgZGVmYXVsdCBvZiArIGFuZCAtIGluZmluaXR5LCB3ZSBzaG91bGQgc2F5IHRoYXQgdGhleSBhcmUgbW9zdCBsaWtlbHkgdG8gb2NjdXIgYmV0d2VlbiAtNSBhbmQgKzUuCmBgYAoKIyMjMi4yLjMgUGxvdGluZyBwcmlvcnMKYGBge3J9CiMgR2VuZXJhdGUgZGF0YSBwb2ludHMKeCA8LSBzZXEoLTIwLCAyMCwgbGVuZ3RoLm91dCA9IDEwMDApICAjIEFkanVzdGVkIHJhbmdlIGZvciBiZXR0ZXIgdmlzdWFsaXphdGlvbgoKIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgdGhlIGRpc3RyaWJ1dGlvbnMKbG9jX2xvZ2lzdGljIDwtIDAKc2NhbGVfbG9naXN0aWMgPC0gMwoKZGZfc3R1ZGVudF90IDwtIDMKbG9jX3N0dWRlbnRfdCA8LSAwCnNjYWxlX3N0dWRlbnRfdCA8LSAyLjUKCmxvY19ub3JtYWwgPC0gMApzY2FsZV9ub3JtYWwgPC0gMwoKIyBDYWxjdWxhdGUgUERGcwpwZGZfbG9naXN0aWMgPC0gZGxvZ2lzKHgsIGxvY2F0aW9uID0gbG9jX2xvZ2lzdGljLCBzY2FsZSA9IHNjYWxlX2xvZ2lzdGljKQpwZGZfc3R1ZGVudF90IDwtIGR0KHgsIGRmID0gZGZfc3R1ZGVudF90KQpwZGZfbm9ybWFsIDwtIGRub3JtKHgsIG1lYW4gPSBsb2Nfbm9ybWFsLCBzZCA9IHNjYWxlX25vcm1hbCkKCiMgUGxvdCB0aGUgUERGcwpkZiA8LSBkYXRhLmZyYW1lKHggPSB4LCBMb2dpc3RpYyA9IHBkZl9sb2dpc3RpYywgU3R1ZGVudF90ID0gcGRmX3N0dWRlbnRfdCwgTm9ybWFsID0gcGRmX25vcm1hbCkKZ2dwbG90KGRmLCBhZXMoeCkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBMb2dpc3RpYywgY29sb3IgPSAiTG9naXN0aWMoMCwgMykiKSkgKyAjIERlZmF1bHQgcHJpb3JzIG9mIExvZ2lzdGljKDAsMSkgaGF2ZSBiZWVuIGJyb2FkZW5lZCBhcyB0aGVzZSBwcmlvcnMgc2VlbWVkIHRvbyByZXN0cmljdGl2ZQogIGdlb21fbGluZShhZXMoeSA9IFN0dWRlbnRfdCwgY29sb3IgPSAiU3R1ZGVudF90KDMsIDAsIDIuNSkiKSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5vcm1hbCwgY29sb3IgPSAiTm9ybWFsKDAsIDMpIikpICsgI0ZvciB0aGUgYmV0YSBjb2VmZmljaWVudCBwcmlvciwgd2Ugd2lsbCBzZXQgaXQgdG8gYmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYXJvdW5kIDAgd2l0aCBhbiBzZCBvZiA1LCBoZXJlIGlzIHRoZSBwbG90dGVkIHByaW9yIGRpc3RyaWJ1dGlvbiAKICBsYWJzKHRpdGxlID0gIlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb25zIiwKICAgICAgIHggPSAieCIsCiAgICAgICB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiRGlzdHJpYnV0aW9uIiwgdmFsdWVzID0gYygiTG9naXN0aWMoMCwgMykiID0gImJsdWUiLCAiU3R1ZGVudF90KDMsIDAsIDIuNSkiID0gImdyZWVuIiwgIk5vcm1hbCgwLCAzKSIgPSAicmVkIikpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgojIyMyLjIuNCBTZXR0aW5nIHByaW9ycyAKYGBge3J9CiN0aGUgcHJpb3JzIGZvciB0aGUgaW50ZXJjZXB0IGhhdmUgYmVlbiBsZWZ0IGFzIHRoZSBkZWZhdWx0IGFuZCB0aGUgY29lZmZpY2llbnQgcHJpb3JzIGRlZmluZWQgYWJvdmUKcHJpb3JzIDwtIGMoc2V0X3ByaW9yKCJzdHVkZW50X3QoMywgMCwgMi41KSIsIGNsYXNzID0gIkludGVyY2VwdCIpLAogICAgICAgICAgICBzZXRfcHJpb3IoImxvZ2lzdGljKDAsIDMpIiwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJjb2kiKSwKICAgICAgICAgICAgc2V0X3ByaW9yKCJsb2dpc3RpYygwLCAzKSIsIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAiem9pIiksCiAgICAgICAgICAgIHNldF9wcmlvcigic3R1ZGVudF90KDMsIDAsIDIuNSkiLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInBoaSIsIGxiID0gMCksCiAgICAgICAgICAgIHNldF9wcmlvcigic3R1ZGVudF90KDMsIDAsIDIuNSkiLCBjbGFzcyA9ICJzZCIsIGxiID0gMCksCiAgICAgICAgICAgIHNldF9wcmlvcigic3R1ZGVudF90KDMsIDAsIDIuNSkiLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAicGhpIiwgbGIgPSAwKSwKICAgICAgICAgICAgc2V0X3ByaW9yKCJzdHVkZW50X3QoMywgMCwgMi41KSIsIGNsYXNzID0gInNkIiwgZHBhciA9ICJ6b2kiLCBsYiA9IDApLAogICAgICAgICAgICBzZXRfcHJpb3IoInN0dWRlbnRfdCgzLCAwLCAyLjUpIiwgY2xhc3MgPSAic2QiLCBkcGFyID0gImNvaSIsIGxiID0gMCksCiAgICAgICAgICAgIHNldF9wcmlvcigibm9ybWFsKDAsIDMpIiwgY2xhc3MgPSAiYiIpLAogICAgICAgICAgICBzZXRfcHJpb3IoIm5vcm1hbCgwLCAzKSIsIGNsYXNzID0gImIiLCBkcGFyID0gInBoaSIpLAogICAgICAgICAgICBzZXRfcHJpb3IoIm5vcm1hbCgwLCAzKSIsIGNsYXNzID0gImIiLCBkcGFyID0gInpvaSIpLAogICAgICAgICAgICBzZXRfcHJpb3IoIm5vcm1hbCgwLCAzKSIsIGNsYXNzID0gImIiLCBkcGFyID0gImNvaSIpKQpgYGAKCiMjIzIuMi41IFByaW9yIHByZWRpY3RpdmUgY2hlY2sgCmBgYHtyfQpwcmlvcl9mb3JtdWxhIDwtIGJmKAogICMgbXUgKG1lYW4pIHBhcnQKICBnb2J5X291dCB+IHN0cm9rZSpzdGFnZSArIGdvYnlfbnVtYmVyICsgc2hyaW1wX251bWJlciArIHNocmltcF9zcGVjaWVzICsgKDEgfCBzaXRlL2J1cnJvdyksCiAgIyBwaGkgKHByZWNpc2lvbikgcGFydAogIHBoaSB+IHN0cm9rZSpzdGFnZSArIGdvYnlfbnVtYmVyICsgc2hyaW1wX251bWJlciArIHNocmltcF9zcGVjaWVzICsgKDEgfCBzaXRlL2J1cnJvdyksCiAgIyBhbHBoYSAoemVyby1vbmUtaW5mbGF0aW9uKSBwYXJ0CiAgem9pIH4gc3Ryb2tlKnN0YWdlICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfbnVtYmVyICsgc2hyaW1wX3NwZWNpZXMgKyAoMSB8IHNpdGUvYnVycm93KSwKICAjIFRoZSBvbmUtaW5mbGF0ZWQgcGFydCwgY29uZGl0aW9uYWwgb24gdGhlIDBzCiAgY29pIH4gc3Ryb2tlKnN0YWdlICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfbnVtYmVyICsgc2hyaW1wX3NwZWNpZXMgKyAoMSB8IHNpdGUvYnVycm93KSwKICAKICBmYW1pbHkgPSB6ZXJvX29uZV9pbmZsYXRlZF9iZXRhKCkKKQoKcHJpb3JfbW9kZWwgPC0gYnJtKAogIHByaW9yX2Zvcm11bGEsCiAgZGF0YSA9IGZpbmFsX2RmLAogIGZhbWlseSA9IHplcm9fb25lX2luZmxhdGVkX2JldGEoKSwKICBwcmlvciA9IHByaW9ycywKICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTksCiAgICAgICAgICAgICAgICAgbWF4X3RyZWVkZXB0aCA9IDEyKSwKICBjaGFpbnMgPSA0LCBpdGVyID0gMTAwMCwgd2FybXVwID0gMTAwLAogIGNvcmVzID0gNCwgdGhyZWFkcyA9IHRocmVhZGluZygyKSwKICBiYWNrZW5kID0gImNtZHN0YW5yIiwKICBzZWVkID0gMSwKICBzYW1wbGVfcHJpb3IgPSAib25seSIsCiAgZmlsZSA9ICJwcmlvcl9jaGVjayIKKQoKcHBfY2hlY2socHJpb3JfbW9kZWwsIG5kcmF3cz0yMCkKcHBfY2hlY2socHJpb3JfbW9kZWwsIG5kcmF3cz0xMDAsIHR5cGUgPSAnc3RhdCcsIHN0YXQgPSAnbWVhbicpCmBgYAoKCiMjMi4zIE1vZGVsbGluZyB0aGUgcHJvcG9ydGlvbiBvZiB0aW1lIGdvYmllcyBzcGVudCBvdXRzaWRlIG9mIHRoZSBidXJyb3cKYGBge3J9CmdvYnlfb3V0X2Zvcm11bGFfMSA8LSBiZigKICAjIG11IChtZWFuKSBwYXJ0CiAgZ29ieV9vdXQgfiBzdHJva2Uqc3RhZ2UgKyBnb2J5X251bWJlciArIHNocmltcF9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxIHwgc2l0ZS9idXJyb3cpLAogICMgcGhpIChwcmVjaXNpb24pIHBhcnQKICBwaGkgfiBzdHJva2Uqc3RhZ2UgKyBnb2J5X251bWJlciArIHNocmltcF9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxIHwgc2l0ZS9idXJyb3cpLAogICMgYWxwaGEgKHplcm8tb25lLWluZmxhdGlvbikgcGFydAogIHpvaSB+IHN0cm9rZSpzdGFnZSArIGdvYnlfbnVtYmVyICsgc2hyaW1wX251bWJlciArIHNocmltcF9zcGVjaWVzICsgKDEgfCBzaXRlL2J1cnJvdyksCiAgIyBUaGUgb25lLWluZmxhdGVkIHBhcnQsIGNvbmRpdGlvbmFsIG9uIHRoZSAwcwogIGNvaSB+IHN0cm9rZSpzdGFnZSArIGdvYnlfbnVtYmVyICsgc2hyaW1wX251bWJlciArIHNocmltcF9zcGVjaWVzICsgKDEgfCBzaXRlL2J1cnJvdyksCiAgCiAgZmFtaWx5ID0gemVyb19vbmVfaW5mbGF0ZWRfYmV0YSgpCikKCmdvYnlfb3V0X21vZGVsIDwtIGJybSgKICBnb2J5X291dF9mb3JtdWxhXzEsCiAgZGF0YSA9IGZpbmFsX2RmLAogIGZhbWlseSA9IHplcm9fb25lX2luZmxhdGVkX2JldGEoKSwKICBwcmlvciA9IHByaW9ycywKICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTksCiAgICAgICAgICAgICAgICAgbWF4X3RyZWVkZXB0aCA9IDEyKSwKICBjaGFpbnMgPSA0LCBpdGVyID0gNDAwMCwgd2FybXVwID0gMTAwMCwKICBjb3JlcyA9IDQsIHRocmVhZHMgPSB0aHJlYWRpbmcoMiksCiAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgc2VlZCA9IDEsCiAgZmlsZSA9ICJnb2J5X291dF9tb2RlbCIKKQoKc3VtbWFyeShnb2J5X291dF9tb2RlbCkKYGBgCiMjIzIuMy4xIE1vZGVsIGZpdCBhbmQgZGlhZ25vc3RpY3MKIyMjIzIuMy4xLjEgTW9kZWwgY29udmVyZ2VuY2UKYGBge3J9CiNjb252ZXJnZW5jZSBkaWFnbm9zdGljcyAoUi1oYXQpCmV4dHJhY3RfcmhhdHMgPC0gZnVuY3Rpb24obW9kZWwpIHsKICBtb2RlbF9zdW1tYXJ5IDwtIHN1bW1hcnkobW9kZWwpCiAgI2V4dHJhY3QgUi1oYXQgdmFsdWVzIGZvciBmaXhlZCBlZmZlY3RzCiAgZml4ZWRfcmhhdHMgPC0gbW9kZWxfc3VtbWFyeSRmaXhlZFssICJSaGF0IiwgZHJvcCA9IEZBTFNFXQogICNjaGVjayBmb3IgcmFuZG9tIGVmZmVjdHMgYW5kIGV4dHJhY3QgUi1oYXQgdmFsdWVzIGlmIHByZXNlbnQKICBpZiAoIWlzLm51bGwobW9kZWxfc3VtbWFyeSRyYW5kb20pKSB7CiAgICByYW5kb21fcmhhdHMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KG1vZGVsX3N1bW1hcnkkcmFuZG9tLCBmdW5jdGlvbih4KSB4WywgIlJoYXQiLCBkcm9wID0gRkFMU0VdKSkKICAgICNjb21iaW5lIGZpeGVkIGFuZCByYW5kb20gZWZmZWN0cyBSLWhhdCB2YWx1ZXMKICAgIHJoYXRzIDwtIHJiaW5kKGZpeGVkX3JoYXRzLCByYW5kb21fcmhhdHMpCiAgfSBlbHNlIHsKICAgIHJoYXRzIDwtIGZpeGVkX3JoYXRzCiAgfQogIAogIHJldHVybihyaGF0cykKfQoKZXh0cmFjdF9yaGF0cyhnb2J5X291dF9tb2RlbCkKYGBgCgojIyMjMi4zLjEuMiBNb2RlbCBmaXQKYGBge3J9CiNwb3N0ZXJpb3IgcHJlZGljdGl2ZSBjaGVja3MKcHBfY2hlY2soZ29ieV9vdXRfbW9kZWwsIG5kcmF3cyA9IDUwKQoKcHBfY2hlY2soZ29ieV9vdXRfbW9kZWwsIHR5cGU9J3N0YXQnLCBzdGF0PSdtZWFuJykKCiNmaXR0ZWQgdnMgcHJlZGljdGVkIHZhbHVlcwpzdW1tYXJ5KGZpdHRlZChnb2J5X291dF9tb2RlbCkpCnN1bW1hcnkocHJlZGljdChnb2J5X291dF9tb2RlbCkpCmBgYAoKIyMjMi4zLjIgUG9zdGVyaW9yIG1hcmdpbmFsIGVmZmVjdHMKIyMjIzIuMy4yLjEgUGFpcndpc2UgY29udHJhc3RzIG9mIHN0cm9rZSBhbmQgc3RhZ2UKYGBge3J9CmdvYnlfb3V0X2NvbnRyYXN0X2VmZmVjdCA8LSBnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBzdHJva2Uqc3RhZ2UsIAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmVfZm9ybWxhID0gTlVMTCwKICAgICAgICAgIHJnLmxpbWl0ID0xNDAwMCkgfD4gCiAgY29udHJhc3QobWV0aG9kID0gInJldnBhaXJ3aXNlIikgCgojIEV4dHJhY3QgdGhlIHJlbGV2YW50IGNvbnRyYXN0IGluZm9ybWF0aW9uCmdvYnlfb3V0X3Jlc3VsdHMudGFibGUgPC0gYXMuZGF0YS5mcmFtZShnb2J5X291dF9jb250cmFzdF9lZmZlY3QpIHw+IAogIGRwbHlyOjpmaWx0ZXIoY29udHJhc3QgJWluJSBjKCJjb250cm9sIFByZSAtIDIgUHJlIiwgImNvbnRyb2wgUHJlIC0gNCBQcmUiLCI0IFByZSAtIDIgUHJlIiwgImNvbnRyb2wgUHJlIC0gY29udHJvbCBEdXJpbmciLCAiY29udHJvbCBQcmUgLSBjb250cm9sIFBvc3QiLCAiNCBQcmUgLSA0IER1cmluZyIsICI0IFByZSAtIDQgUG9zdCIsICIyIFByZSAtIDIgRHVyaW5nIiwgIjIgUHJlIC0gMiBQb3N0IikpCgpnb2J5X291dF9yZXN1bHRzLnRhYmxlCgpnb2J5X291dF9jb250cmFzdF9kcmF3cyA8LSBnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBzdHJva2Uqc3RhZ2UsIAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmVfZm9ybWxhID0gTlVMTCwKICAgICAgICAgIHJnLmxpbWl0ID0xNDAwMCkgfD4gCiAgY29udHJhc3QobWV0aG9kID0gInJldnBhaXJ3aXNlIikgfD4gCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKQogIGdvYnlfb3V0X2NvbnRyYXN0X2RyYXdzCgpnb2J5X291dF90ZW1wb3JhbF9jb250cmFzdHMgPC0gZ29ieV9vdXRfY29udHJhc3RfZHJhd3MgfD4gCiAgZHBseXI6OmZpbHRlcihjb250cmFzdCAlaW4lIGMoImNvbnRyb2wgUHJlIC0gY29udHJvbCBEdXJpbmciLCAiY29udHJvbCBQcmUgLSBjb250cm9sIFBvc3QiLCAiNCBQcmUgLSA0IER1cmluZyIsICI0IFByZSAtIDQgUG9zdCIsICIyIFByZSAtIDIgRHVyaW5nIiwgIjIgUHJlIC0gMiBQb3N0IikpIHw+IAogIG11dGF0ZShzdHJva2UgPSBpZmVsc2UoY29udHJhc3QgJWluJSBjKCJjb250cm9sIFByZSAtIGNvbnRyb2wgRHVyaW5nIiwgImNvbnRyb2wgUHJlIC0gY29udHJvbCBQb3N0IiksICJDb250cm9sIiwgaWZlbHNlKGNvbnRyYXN0ICVpbiUgYygiNCBQcmUgLSA0IER1cmluZyIsICI0IFByZSAtIDQgUG9zdCIpLCAiNCIsICIyIikpKQoKZ29ieV9vdXRfdGVtcG9yYWxfY29udHJhc3RzJHN0cm9rZSA8LSBmYWN0b3IoZ29ieV9vdXRfdGVtcG9yYWxfY29udHJhc3RzJHN0cm9rZSwgbGV2ZWxzID0gYygiQ29udHJvbCIsICI0IiwgIjIiKSkKCmZpZy5nb2J5X291dF90ZW1wb3JhbF9jb250cmFzdHM8LSBnZ3Bsb3QoZ29ieV9vdXRfdGVtcG9yYWxfY29udHJhc3RzLCBhZXMoeCA9IC52YWx1ZSwgeSA9IGZhY3Rvcihjb250cmFzdCwgbGV2ZWxzID0gYygiY29udHJvbCBQcmUgLSBjb250cm9sIER1cmluZyIsICJjb250cm9sIFByZSAtIGNvbnRyb2wgUG9zdCIsICI0IFByZSAtIDQgRHVyaW5nIiwgIjQgUHJlIC0gNCBQb3N0IiwgIjIgUHJlIC0gMiBEdXJpbmciLCAiMiBQcmUgLSAyIFBvc3QiKSksIGNvbG9yID0gc3Ryb2tlLCBmaWxsID0gc3Ryb2tlKSkgKwogICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUpICsKICBzdGF0X2hhbGZleWUoLndpZHRoID0gYygwLjg5LCAwLjk1KSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoY29sb3VyMTEsIGNvbG91cjEyLCBjb2xvdXIxMykpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBhbHBoYShjKGNvbG91cjEsIGNvbG91cjIsIGNvbG91cjMpLCAwLjgpKSArCiAgbGFicyh5ID0gIkNvbnRyYXN0cyBvZiB0aGUgdGltZSBwZXJpb2RzIHJlbGF0aXZlIHRvIG5vaXNlIGV4cG9zdXJlIiwKICAgICAgIGZpbGwgPSAiTm9pc2UgdHJlYXRtZW50IiwgY29sb3IgPSAiTm9pc2UgdHJlYXRtZW50IiwKICAgICAgIGZpbGxfcmFtcCA9ICJDcmVkaWJsZSBpbnRlcnZhbCIpICsKICB4bGFiKE5VTEwpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNTAsIGhqdXN0ID0xKSkgKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzID0gYygiUHJlIC0gRHVyaW5nIiwgIlByZSAtIFBvc3QiLCAiUHJlIC0gRHVyaW5nIiwgIlByZSAtIFBvc3QiLCAiUHJlIC0gRHVyaW5nIiwgIlByZSAtIFBvc3QiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoLTAuNCwgMC41LCAwLjEpLCBsYWJlbHMgPSBjKCItMC40IiwiLTAuMyIsICItMC4yIiwiLTAuMSIgLCAiMCIsICIwLjEiLCAiMC4yIiwgIjAuMyIsICIwLjQiLCAiMC41IiksIGxpbWl0cyA9IGMoLTAuNCwgMC40KSkKCmZpZy5nb2J5X291dF90ZW1wb3JhbF9jb250cmFzdHMKYGBgCiMjIzIuMy4zIEV4dHJhY3RpbmcgYW5kIHBsb3R0aW5nIG1vZGVsIGVzdGltYXRlcwojIyMjMi4zLjMuMSBFeHRyYWN0aW5nIGVzdGltYXRlcwpgYGB7cn0KZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzIDwtIGdvYnlfb3V0X21vZGVsIHw+IAogIGVtbWVhbnMofiBzdHJva2Uqc3RhZ2UsCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZy5saW1pdCA9IDE0MDAwLAogICAgICAgICAgcmVfZm9ybXVsYSA9IE5BKQoKZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzIDwtIGFzLmRhdGEuZnJhbWUoZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzKQoKI1N0b3JpbmcgdGhlIG1vZGVsIGVzdGltYXRlIG1lYW5zIGZvciBlYWNoIGdyb3VwIHRvIHBsb3QgbGF0ZXIgb24KZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzX2NvbnRyb2wgPC0gZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ICJjb250cm9sIikgfD4gCiAgcmVuYW1lKC52YWx1ZSA9IGVtbWVhbikKCmdvYnlfb3V0X21vZGVsX2VzdGltYXRlc19mb3VyIDwtIGdvYnlfb3V0X21vZGVsX2VzdGltYXRlcyB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSAiNCIpfD4gCiAgcmVuYW1lKC52YWx1ZSA9IGVtbWVhbikKCmdvYnlfb3V0X21vZGVsX2VzdGltYXRlc190d28gPC0gZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ICIyIil8PiAKICByZW5hbWUoLnZhbHVlID0gZW1tZWFuKQpgYGAKCiMjIyMyLjMuMy4yIFBsb3R0aW5nIG1vZGVsIGVzdGltYXRlcyBhbmQgcmF3IGRhdGEKYGBge3J9CmdvYnlfb3V0X21vZGVsX2RyYXdzIDwtIGdvYnlfb3V0X21vZGVsIHw+IAogIGVtbWVhbnMofiBzdHJva2Uqc3RhZ2UsCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZy5saW1pdCA9IDE0MDAwLAogICAgICAgICAgcmVfZm9ybXVsYSA9IE5BKSB8PiAKICBnYXRoZXJfZW1tZWFuc19kcmF3cygpCgpnb2J5X291dF9tb2RlbF9kcmF3cyA8LSBnb2J5X291dF9tb2RlbF9kcmF3cyB8PiAKICByZW5hbWUoZW1tZWFuID0gLnZhbHVlKQoKZ29ieV9vdXRfcmF3X2RhdGEgPC0gZmluYWxfZGYgfD4gCiAgcmVuYW1lKGVtbWVhbiA9IGdvYnlfb3V0KQoKZ29ieV9vdXRfcmF3X2RhdGEkc3RhZ2UgPC0gZmFjdG9yKGdvYnlfb3V0X3Jhd19kYXRhJHN0YWdlLCBsZXZlbHMgPSBjKCJQcmUiLCAiRHVyaW5nIiwgIlBvc3QiKSkKZ29ieV9vdXRfcmF3X2RhdGEkc3Ryb2tlIDwtIGZhY3Rvcihnb2J5X291dF9yYXdfZGF0YSRzdHJva2UsIGxldmVscyA9IGMoImNvbnRyb2wiLCAiNCIsICIyIikpCgpnb2J5X291dF9tb2RlbF9lc3RpbWF0ZXMkc3RhZ2UgPC0gZmFjdG9yKGdvYnlfb3V0X21vZGVsX2VzdGltYXRlcyRzdGFnZSwgbGV2ZWxzID0gYygiUHJlIiwgIkR1cmluZyIsICJQb3N0IikpCmdvYnlfb3V0X21vZGVsX2VzdGltYXRlcyRzdHJva2UgPC0gZmFjdG9yKGdvYnlfb3V0X21vZGVsX2VzdGltYXRlcyRzdHJva2UsIGxldmVscyA9IGMoImNvbnRyb2wiLCAiNCIsICIyIikpCgpnb2J5X291dF9tb2RlbF9kcmF3cyRzdGFnZSA8LSBmYWN0b3IoZ29ieV9vdXRfbW9kZWxfZHJhd3Mkc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKQpnb2J5X291dF9tb2RlbF9kcmF3cyRzdHJva2UgPC0gZmFjdG9yKGdvYnlfb3V0X21vZGVsX2RyYXdzJHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0IiwgIjIiKSkKCmdvYnlfb3V0X21lYW5zIDwtIGdvYnlfb3V0X3Jhd19kYXRhIHw+IAogIGdyb3VwX2J5KHN0YWdlLCBzdHJva2UpIHw+IAogIHN1bW1hcmlzZShlbW1lYW4gPSBtZWFuKGVtbWVhbikpCgoKZ29ieV9vdXRfZmlnX3RvZ2V0aGVyIDwtIGdncGxvdChkYXRhID0gZ29ieV9vdXRfcmF3X2RhdGEsIGFlcyh4ID0gc3RhZ2UsIHkgPSBlbW1lYW4sIGNvbG9yID0gc3Ryb2tlLCBmaWxsID0gc3Ryb2tlKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGdvYnlfb3V0X21lYW5zLCBhbHBoYSA9IDEsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2VudWRnZSh3aWR0aCA9IDAuOCwgeCA9IC0wLjA5KSwgc2l6ZSA9IDksIHNoYXBlID0gIl8iKSArCiAgZ2VvbV9oYWxmX3BvaW50KGFscGhhID0gMC4zLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlbnVkZ2Uod2lkdGggPSAwLjgsIHggPSAtMC4wMyksIHNpZGUgPSAibCIsIHJhbmdlX3NjYWxlID0gMC41KSArCiAgZ2VvbV9oYWxmX3Zpb2xpbihkYXRhID0gZ29ieV9vdXRfbW9kZWxfZHJhd3MsIGFlcyh4ID0gc3RhZ2UsIHkgPSBlbW1lYW4sIGNvbG9yID0gc3Ryb2tlLCBmaWxsID0gc3Ryb2tlKSwgYWxwaGEgPSAwLjYsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCBzaWRlID0gInIiLCBzaXplID0gMCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGdvYnlfb3V0X21vZGVsX2VzdGltYXRlcywgYWVzKHggPSBzdGFnZSwgeSA9IGVtbWVhbiwgY29sb3IgPSBzdHJva2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKGRhdGEgPSBnb2J5X291dF9tb2RlbF9lc3RpbWF0ZXMsIGFlcyh4ID0gc3RhZ2UsIHkgPSBlbW1lYW4sIHltaW4gPSBsb3dlci5IUEQsIHltYXggPSB1cHBlci5IUEQsIGNvbG9yID0gc3Ryb2tlKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHdpZHRoID0gMCwgc2l6ZSA9IDEuMjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJjb250cm9sIiA9ICIjNzZBMzRBIiwgIjQiID0gIiNGMjlFMDAiLCAiMiIgPSAiI0UyNUEwMCIpLCBuYW1lID0gIk5vaXNlIGV4cG9zdXJlIiwgZ3VpZGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMykpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImNvbnRyb2wiID0gIiMyQTMzMEUiLCAiNCIgPSAiIzgwNTIxMyIsICIyIiA9ICIjNTQyNzA5IiksIG5hbWUgPSAiTm9pc2UgZXhwb3N1cmUiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzKSkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKSArCiAgbGFicyh0aXRsZSA9ICJUaGUgZWZmZWN0cyBvZiBib2F0IG5vaXNlIG9uIGdvYnkgYnVycm93IHVzZSIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgdGltZSBpbiBvdXQgb2YgdGhlIGJ1cnJvdyIsCiAgICAgICB4ID0gIkV4cGVyaW1lbnRhbCBwaGFzZSByZWxhdGl2ZSB0byBub2lzZSBleHBvc3VyZSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDUpKSwgIAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBtYXJnaW4gPSBtYXJnaW4ociA9IDUpKSwgIAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgbWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgbWFyZ2luID0gbWFyZ2luKHIgPSAxMCkpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gInRvcCIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYpLCAgCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxMCwgMTAsIDEwLCAxMCkKICApCgpnb2J5X291dF9maWdfdG9nZXRoZXIKYGBgCgoKIyMjIzIuMy4zLjMgUGxvdHRpbmcgY29udHJvbCBlc3RpbWF0ZXMgYW5kIHJhdyBkYXRhCmBgYHtyfQpnb2J5X291dF9tb2RlbF9kcmF3cyA8LSBnb2J5X291dF9tb2RlbCB8PiAKICBlbW1lYW5zKH4gc3Ryb2tlKnN0YWdlLAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmcubGltaXQgPSAxNDAwMCwKICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSkgfD4gCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKQoKZ29ieV9vdXRfcmF3X2RhdGEgPC0gZmluYWxfZGYgfD4KICByZW5hbWUoLnZhbHVlID0gZ29ieV9vdXQpCgpnb2J5X291dF9tb2RlbF9kcmF3cyRzdGFnZSA8LSBmYWN0b3IoZ29ieV9vdXRfbW9kZWxfZHJhd3Mkc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKQpnb2J5X291dF9tb2RlbF9kcmF3cyRzdHJva2UgPC0gZmFjdG9yKGdvYnlfb3V0X21vZGVsX2RyYXdzJHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0IiwgIjIiKSkKCmdvYnlfb3V0X2NvbnRyb2xfbW9kZWxfZHJhd3MgPC0gZ29ieV9vdXRfbW9kZWxfZHJhd3MgfD4gCiAgZHBseXI6OmZpbHRlcihzdHJva2UgPT0gImNvbnRyb2wiKQoKZ29ieV9jb250cm9sX3Jhd19kYXRhIDwtIGZpbmFsX2RmIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ImNvbnRyb2wiKSB8PiAKICByZW5hbWUoLnZhbHVlID0gZ29ieV9vdXQpCgpnb2J5X2NvbnRyb2xfbWVhbnMgPC0gZ29ieV9jb250cm9sX3Jhd19kYXRhIHw+IAogIGdyb3VwX2J5KHN0YWdlKSB8PiAKICBzdW1tYXJpc2UoLnZhbHVlID0gbWVhbigudmFsdWUpKQoKZ29ieV9jb250cm9sX3Jhd19kYXRhJHN0YWdlIDwtIGZhY3Rvcihnb2J5X2NvbnRyb2xfcmF3X2RhdGEkc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKQoKI2Fzc2lnbmluZyBhIHZhbHVlIGZvciB0aGUgYmFzZWxpbmUgbWVhbgpnb2J5X291dF9tb2RlbF9lc3RpbWF0ZXNfY29udHJvbF9pbnRlcmNlcHQgPC0gZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzX2NvbnRyb2wgJT4lCiAgZHBseXI6OmZpbHRlcihzdGFnZSA9PSAiUHJlIikgJT4lCiAgcHVsbCgudmFsdWUpCgpnb2J5X291dF9maWdfY29udHJvbCA8LSBnZ3Bsb3QoZ29ieV9jb250cm9sX3Jhd19kYXRhLCBhZXMoeSA9IC52YWx1ZSwgeCA9IHN0YWdlLCBmaWxsID0gc3RhZ2UsIGNvbG9yID0gc3RhZ2UpKSArCiAgZ2VvbV9oYWxmX3Zpb2xpbihkYXRhID0gZ29ieV9vdXRfY29udHJvbF9tb2RlbF9kcmF3cywgYWxwaGEgPSAwLjcsIHNpemUgPSAwLCBzaWRlID0gInIiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJudWRnZSh4ID0gLTAuMSwgd2lkdGggPSAwLjEsIG51ZGdlLmZyb20gPSAiaml0dGVyZWQiKSwgYWxwaGEgPSAwLjQsIHNpemUgPSAyKSArCiAgZ2VvbV9jcm9zc2JhcihhbHBoYSA9IDAuNiwgc2l6ZSA9IDAuOCwgZGF0YSA9IGdvYnlfb3V0X21vZGVsX2VzdGltYXRlc19jb250cm9sLCBhZXMoeW1pbiA9IGxvd2VyLkhQRCwgeW1heCA9IHVwcGVyLkhQRCksIHdpZHRoID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gMC4yKSkrCiAgZ2VvbV9wb2ludChwY2ggPSAyMywgc3Ryb2tlID0gMS4yLCBkYXRhID0gZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzX2NvbnRyb2wsIHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZ29ieV9jb250cm9sX21lYW5zLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlbnVkZ2Uod2lkdGggPSAwLjgsIHggPSAtMC4xKSwgc2l6ZSA9IDksIHNoYXBlID0gIl8iKSArCiAgbGFicyh4PSJQZXJpb2QgcmVsYXRpdmUgdG8gdHJlYXRtZW50IiwKICAgICAgIHk9IlByb3BvcnRpb24gb2YgdGltZSBvdXQgb2YgYnVycm93IikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLCAgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSwKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgYiA9IDAsIGwgPSAwLCByID0gMTApKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0Ym94X3NpbXBsZShmYWNlID0gImJvbGQiLCBzaXplID0gMTYsIGhhbGlnbiA9IDAuNSwgbGluZXdpZHRoID0gMC4zLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICIjQTNDMDg4IiwgcGFkZGluZyA9IG1hcmdpbig1LCA1LCA1LCA1KSksIAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG91ciA9IE5BKSkrCiAgZ2d0aXRsZSgiQ29udHJvbCIpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlByZSIgPSAiZGFya2dyZXkiLCAiRHVyaW5nIiA9ICIjNzZBMzRBIiwgIlBvc3QiID0gIiNEM0Q5QTciKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJQcmUiID0gIiMyNDI0MjQiLCAiRHVyaW5nIiA9ICIjMkEzMzBFIiwgIlBvc3QiID0gIiM1ZDYzNGMiKSkKCmdvYnlfb3V0X2ZpZ19jb250cm9sCmBgYAojIyMjMi4zLjMuNCBQbG90dGluZyA0LXN0cm9rZSBlc3RpbWF0ZXMgYW5kIHJhdyBkYXRhCmBgYHtyfQpnb2J5X291dF9jb250cm9sX21vZGVsX2RyYXdzIDwtIGdvYnlfb3V0X21vZGVsX2RyYXdzIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ICI0IikKCmdvYnlfZm91cl9yYXdfZGF0YSA8LSBmaW5hbF9kZiB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSI0IikgfD4gCiAgcmVuYW1lKC52YWx1ZSA9IGdvYnlfb3V0KQoKZ29ieV9mb3VyX3Jhd19kYXRhJHN0YWdlIDwtIGZhY3Rvcihnb2J5X2ZvdXJfcmF3X2RhdGEkc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKQoKZ29ieV9mb3VyX21lYW5zIDwtIGdvYnlfZm91cl9yYXdfZGF0YSB8PiAKICBncm91cF9ieShzdGFnZSkgfD4gCiAgc3VtbWFyaXNlKC52YWx1ZSA9IG1lYW4oLnZhbHVlKSkKCmdvYnlfb3V0X2ZpZ19mb3VyIDwtIGdncGxvdChnb2J5X2ZvdXJfcmF3X2RhdGEsIGFlcyh5ID0gLnZhbHVlLCB4ID0gc3RhZ2UsIGZpbGwgPSBzdGFnZSwgY29sb3IgPSBzdGFnZSkpICsKICBnZW9tX2hhbGZfdmlvbGluKGRhdGEgPSBnb2J5X291dF9jb250cm9sX21vZGVsX2RyYXdzLCBhbHBoYSA9IDAuNywgc2l6ZSA9IDAsIHNpZGUgPSAiciIsIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAuMikpICsKICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcm51ZGdlKHggPSAtMC4xLCB3aWR0aCA9IDAuMSwgbnVkZ2UuZnJvbSA9ICJqaXR0ZXJlZCIpLCBhbHBoYSA9IDAuNCwgc2l6ZSA9IDIpICsKICBnZW9tX2Nyb3NzYmFyKGFscGhhID0gMC42LCBzaXplID0gMC44LCBkYXRhID0gZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzX2ZvdXIsIGFlcyh5bWluID0gbG93ZXIuSFBELCB5bWF4ID0gdXBwZXIuSFBEKSwgd2lkdGggPSAwLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSsKICBnZW9tX3BvaW50KHBjaCA9IDIzLCBzdHJva2UgPSAxLjIsIGRhdGEgPSBnb2J5X291dF9tb2RlbF9lc3RpbWF0ZXNfZm91ciwgc2l6ZSA9IDIsIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAuMikpICsKICBnZW9tX3BvaW50KGRhdGEgPSBnb2J5X2ZvdXJfbWVhbnMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2VudWRnZSh3aWR0aCA9IDAuOCwgeCA9IC0wLjEpLCBzaXplID0gOSwgc2hhcGUgPSAiXyIpICsKICB4bGFiKCJFeHBlcmltZW50YWwgcGhhc2UgcmVsYXRpdmUgdG8gbm9pc2UgZXhwb3N1cmUiKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMyksICAKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIsIG1hcmdpbiA9IG1hcmdpbih0ID0gMTUsIGIgPSAwLCBsID0gMCwgciA9IDApKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0Ym94X3NpbXBsZShmYWNlID0gImJvbGQiLCBzaXplID0gMTYsIGhhbGlnbiA9IDAuNSwgbGluZXdpZHRoID0gMC4zLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICIjRjZCQzY1IiwgcGFkZGluZyA9IG1hcmdpbig1LCA1LCA1LCA1KSksIAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG91ciA9IE5BKSkrCiAgZ2d0aXRsZSgiNC1zdHJva2UiKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJQcmUiID0gImRhcmtncmV5IiwgIkR1cmluZyIgPSAiI0YyOUUwMCIsICJQb3N0IiA9ICIjRjJENUEwIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiUHJlIiA9ICIjMjQyNDI0IiwgIkR1cmluZyIgPSAiIzgwNTIxMyIsICJQb3N0IiA9ICIjNzA1MzJiIikpCgpnb2J5X291dF9maWdfZm91cgpgYGAKCiMjIyMyLjMuMy41IFBsb3R0aW5nIDItc3Ryb2tlIGVzdGltYXRlcyBhbmQgcmF3IGRhdGEKYGBge3J9CmdvYnlfb3V0X2NvbnRyb2xfbW9kZWxfZHJhd3MgPC0gZ29ieV9vdXRfbW9kZWxfZHJhd3MgfD4gCiAgZHBseXI6OmZpbHRlcihzdHJva2UgPT0gIjIiKQoKZ29ieV90d29fcmF3X2RhdGEgPC0gZmluYWxfZGYgfD4gCiAgZHBseXI6OmZpbHRlcihzdHJva2UgPT0iMiIpIHw+IAogIHJlbmFtZSgudmFsdWUgPSBnb2J5X291dCkKCmdvYnlfdHdvX3Jhd19kYXRhJHN0YWdlIDwtIGZhY3Rvcihnb2J5X3R3b19yYXdfZGF0YSRzdGFnZSwgbGV2ZWxzID0gYygiUHJlIiwgIkR1cmluZyIsICJQb3N0IikpCgpnb2J5X3R3b19tZWFucyA8LSBnb2J5X3R3b19yYXdfZGF0YSB8PiAKICBncm91cF9ieShzdGFnZSkgfD4gCiAgc3VtbWFyaXNlKC52YWx1ZSA9IG1lYW4oLnZhbHVlKSkKCmdvYnlfb3V0X2ZpZ190d28gPC0gZ2dwbG90KGdvYnlfdHdvX3Jhd19kYXRhLCBhZXMoeSA9IC52YWx1ZSwgeCA9IHN0YWdlLCBmaWxsID0gc3RhZ2UsIGNvbG9yID0gc3RhZ2UpKSArCiAgZ2VvbV9oYWxmX3Zpb2xpbihkYXRhID0gZ29ieV9vdXRfY29udHJvbF9tb2RlbF9kcmF3cywgYWxwaGEgPSAwLjcsIHNpemUgPSAwLCBzaWRlID0gInIiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJudWRnZSh4ID0gLTAuMSwgd2lkdGggPSAwLjEsIG51ZGdlLmZyb20gPSAiaml0dGVyZWQiKSwgYWxwaGEgPSAwLjQsIHNpemUgPSAyKSArCiAgZ2VvbV9jcm9zc2JhcihhbHBoYSA9IDAuNiwgc2l6ZSA9IDAuOCwgZGF0YSA9IGdvYnlfb3V0X21vZGVsX2VzdGltYXRlc190d28sIGFlcyh5bWluID0gbG93ZXIuSFBELCB5bWF4ID0gdXBwZXIuSFBEKSwgd2lkdGggPSAwLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSsKICBnZW9tX3BvaW50KHBjaCA9IDIzLCBzdHJva2UgPSAxLjIsIGRhdGEgPSBnb2J5X291dF9tb2RlbF9lc3RpbWF0ZXNfdHdvLCBzaXplID0gMiwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gMC4yKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGdvYnlfdHdvX21lYW5zLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlbnVkZ2Uod2lkdGggPSAwLjgsIHggPSAtMC4xKSwgc2l6ZSA9IDksIHNoYXBlID0gIl8iKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksICAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0Ym94X3NpbXBsZShmYWNlID0gImJvbGQiLCBzaXplID0gMTYsIGhhbGlnbiA9IDAuNSwgbGluZXdpZHRoID0gMC4zLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICIjRUI5MDYzIiwgcGFkZGluZyA9IG1hcmdpbig1LCA1LCA1LCA1KSksIAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG91ciA9IE5BKSkrCiAgZ2d0aXRsZSgiMi1zdHJva2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiUHJlIiA9ICJkYXJrZ3JleSIsICJEdXJpbmciID0gIiNFMjVBMDAiLCAiUG9zdCIgPSAiI0YyQjM4OSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIlByZSIgPSAiIzI0MjQyNCIsICJEdXJpbmciID0gIiM1NDI3MDkiLCAiUG9zdCIgPSAiIzY2NDIyYSIpKQoKZ29ieV9vdXRfZmlnX3R3bwpgYGAKIyMjIzIuMy4zLjYgQ29tYmluaW5nIHBsb3RzIGludG8gb25lIGZpZ3VyZQpgYGB7cn0KZ29ieV9vdXRfcGxvdDMgPC0gZ29ieV9vdXRfZmlnX2NvbnRyb2wgKyBnb2J5X291dF9maWdfZm91ciArIGdvYnlfb3V0X2ZpZ190d28gKyAKICBwbG90X2xheW91dChuY29sID0gMykKCmdvYnlfb3V0X3Bsb3QzCmdnc2F2ZSgiLi8zLWZpZ3MvZ29ieV9vdXRfcGxvdDMuanBlZyIsIHBsb3QgPSBnb2J5X291dF9wbG90MywgdW5pdHMgPSAicHgiLCB3aWR0aCA9IDIyMDAsIGhlaWdodCA9IDE0MDAsIGRwaSA9IDMwMCkKYGBgCgojIyMyLjMuNCBFZmZlY3RzIG9mIGNvdmFyaWF0ZXMgb24gdGhlIHByb3BvcnRpb24gb2YgdGltZSBnb2JpZXMgc3BlbnQgb3V0c2lkZSBvZiB0aGUgYnVycm93CiMjIyMyLjMuNC4xIEdvYnkgbnVtYmVyCmBgYHtyfQpnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBnb2J5X251bWJlciwgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMKQoKZ29ieV9vdXRfZ29ieV9udW1iZXIgPC0gZ29ieV9vdXRfbW9kZWwgfD4KICBlbW1lYW5zKH4gZ29ieV9udW1iZXIsIAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmVfZm9ybWxhID0gTlVMTCkgfD4gCiAgY29udHJhc3QobWV0aG9kID0gInJldnBhaXJ3aXNlIikKCmdvYnlfb3V0X2dvYnlfbnVtYmVyCgpnb2J5X291dF9nb2J5X251bWJlcl9kcmF3cyA8LSBnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBnb2J5X251bWJlciwgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMKSB8PiAKICBjb250cmFzdChtZXRob2QgPSAicmV2cGFpcndpc2UiKXw+IAogIGdhdGhlcl9lbW1lYW5zX2RyYXdzKCkKCmdvYnlfb3V0X2dvYnlfbnVtYmVyX2ZpZzwtIGdncGxvdChnb2J5X291dF9nb2J5X251bWJlcl9kcmF3cywgYWVzKHggPSAudmFsdWUsIHkgPSBjb250cmFzdCkpICsKICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41KSArCiAgc3RhdF9oYWxmZXllKC53aWR0aCA9IGMoMC45NSkpKwogIGxhYnMoeSA9ICJDb250cmFzdHMgb2YgdGhlIGVmZmVjdCBvZiB0aGUgbnVtYmVyIG9mIGdvYnkiLAogICAgICAgZmlsbCA9ICJOb2lzZSB0cmVhdG1lbnQiLCBjb2xvciA9ICJOb2lzZSB0cmVhdG1lbnQiLAogICAgICAgZmlsbF9yYW1wID0gIkNyZWRpYmxlIGludGVydmFsIikgKwogIHhsYWIoTlVMTCkgKwogIGNvb3JkX2ZsaXAoKQoKZ29ieV9vdXRfZ29ieV9udW1iZXJfZmlnCmBgYAoKIyMjIzIuMy40LjIgU2hyaW1wIG51bWJlcgpgYGB7cn0KZ29ieV9vdXRfc2hyaW1wX251bWJlciA8LSBnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBzaHJpbXBfbnVtYmVyLCAKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJlX2Zvcm1sYSA9IE5VTEwpIHw+IAogIGNvbnRyYXN0KG1ldGhvZCA9ICJyZXZwYWlyd2lzZSIpCgpnb2J5X291dF9zaHJpbXBfbnVtYmVyCgpnb2J5X291dF9zaHJpbXBfbnVtYmVyX2VzdGltYXRlcyA8LSBnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBzaHJpbXBfbnVtYmVyLCAKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJlX2Zvcm1sYSA9IE5VTEwpCgpnb2J5X291dF9zaHJpbXBfbnVtYmVyX2VzdGltYXRlcwoKZ29ieV9vdXRfc2hyaW1wX251bWJlcl9kcmF3cyA8LSBnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBzaHJpbXBfbnVtYmVyLCAKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJlX2Zvcm1sYSA9IE5VTEwpIHw+IAogIGNvbnRyYXN0KG1ldGhvZCA9ICJyZXZwYWlyd2lzZSIpfD4gCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKQoKZ29ieV9vdXRfc2hyaW1wX251bWJlcl9maWc8LSBnZ3Bsb3QoZ29ieV9vdXRfc2hyaW1wX251bWJlcl9kcmF3cywgYWVzKHggPSAudmFsdWUsIHkgPSBjb250cmFzdCkpICsKICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41KSArCiAgc3RhdF9oYWxmZXllKC53aWR0aCA9IGMoMC45NSkpKwogIGxhYnMoeSA9ICJDb250cmFzdHMgb2YgdGhlIGVmZmVjdCBvZiB0aGUgbnVtYmVyIG9mIHNocmltcCIsCiAgICAgICBmaWxsID0gIk5vaXNlIHRyZWF0bWVudCIsIGNvbG9yID0gIk5vaXNlIHRyZWF0bWVudCIsCiAgICAgICBmaWxsX3JhbXAgPSAiQ3JlZGlibGUgaW50ZXJ2YWwiKSArCiAgeGxhYihOVUxMKSArCiAgY29vcmRfZmxpcCgpCgpnb2J5X291dF9zaHJpbXBfbnVtYmVyX2ZpZwpgYGAKCiMjIyMyLjMuNC4zIFNocmltcCBzcGVjaWVzCmBgYHtyfQpnb2J5X291dF9zaHJpbXBfc3BlY2llcyA8LSBnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBzaHJpbXBfc3BlY2llcywgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMKSB8PiAKICBjb250cmFzdChtZXRob2QgPSAicmV2cGFpcndpc2UiKQoKZ29ieV9vdXRfc2hyaW1wX3NwZWNpZXMgPC0gYXMuZGF0YS5mcmFtZShnb2J5X291dF9zaHJpbXBfc3BlY2llcykKCmdvYnlfb3V0X3NocmltcF9zcGVjaWVzX2VzdGltYXRlcyA8LSBnb2J5X291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBzaHJpbXBfc3BlY2llcywgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMKQoKZ29ieV9vdXRfc2hyaW1wX3NwZWNpZXNfZXN0aW1hdGVzIDwtIGFzLmRhdGEuZnJhbWUoZ29ieV9vdXRfc2hyaW1wX3NwZWNpZXNfZXN0aW1hdGVzKQoKZ29ieV9vdXRfc2hyaW1wX3NwZWNpZXNfZHJhd3MgPC0gZ29ieV9vdXRfbW9kZWwgfD4KICBlbW1lYW5zKH4gc2hyaW1wX3NwZWNpZXMsIAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmVfZm9ybWxhID0gTlVMTCkgfD4gCiAgY29udHJhc3QobWV0aG9kID0gInJldnBhaXJ3aXNlIil8PiAKICBnYXRoZXJfZW1tZWFuc19kcmF3cygpCgpnb2J5X291dF9zaHJpbXBfc3BlY2llc19maWc8LSBnZ3Bsb3QoZ29ieV9vdXRfc2hyaW1wX3NwZWNpZXNfZHJhd3MsIGFlcyh4ID0gLnZhbHVlLCB5ID0gY29udHJhc3QpKSArCiAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKwogIHN0YXRfaGFsZmV5ZSgud2lkdGggPSBjKDAuOTUpKSsKICBsYWJzKHkgPSAiQ29udHJhc3RzIG9mIHRoZSBlZmZlY3Qgb2YgdGhlIHNwZWNpZXMgb2Ygc2hyaW1wIiwKICAgICAgIGZpbGwgPSAiTm9pc2UgdHJlYXRtZW50IiwgY29sb3IgPSAiTm9pc2UgdHJlYXRtZW50IiwKICAgICAgIGZpbGxfcmFtcCA9ICJDcmVkaWJsZSBpbnRlcnZhbCIpICsKICB4bGFiKE5VTEwpICsKICBjb29yZF9mbGlwKCkKCmdvYnlfb3V0X3NocmltcF9zcGVjaWVzX2ZpZwpgYGAKCgojIzIuNCBNb2RlbGxpbmcgdGhlIHByb3BvcnRpb24gb2YgdGltZSBzaHJpbXAgc3BlbnQgb3V0c2lkZSBvZiB0aGUgYnVycm93CmBgYHtyfQpzaHJpbXBfb3V0X2Zvcm11bGEgPC0gYmYoCiAgIyBtdSAobWVhbikgcGFydAogIHNocmltcF9vdXQgfiBzdHJva2Uqc3RhZ2UgKyBzaHJpbXBfbnVtYmVyICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxfHNpdGUvYnVycm93KSwKICAjIHBoaSAocHJlY2lzaW9uKSBwYXJ0CiAgcGhpIH4gc3Ryb2tlKnN0YWdlICsgc2hyaW1wX251bWJlciArIGdvYnlfbnVtYmVyICsgc2hyaW1wX3NwZWNpZXMgKyAoMXxzaXRlL2J1cnJvdyksCiAgIyBhbHBoYSAoemVyby1vbmUtaW5mbGF0aW9uKSBwYXJ0CiAgem9pIH4gc3Ryb2tlKnN0YWdlICsgc2hyaW1wX251bWJlciArIGdvYnlfbnVtYmVyICsgc2hyaW1wX3NwZWNpZXMgKyAoMXxzaXRlL2J1cnJvdyksCiAgIyBUaGUgb25lLWluZmxhdGVkIHBhcnQsIGNvbmRpdGlvbmFsIG9uIHRoZSAwcwogIGNvaSB+IHN0cm9rZSpzdGFnZSArIHNocmltcF9udW1iZXIgKyBnb2J5X251bWJlciArIHNocmltcF9zcGVjaWVzICsgKDF8c2l0ZS9idXJyb3cpLAogIAogIGZhbWlseSA9IHplcm9fb25lX2luZmxhdGVkX2JldGEoKQopCgpzaHJpbXBfb3V0X21vZGVsIDwtIGJybSgKICBzaHJpbXBfb3V0X2Zvcm11bGEsCiAgZGF0YSA9IGZpbmFsX2RmLAogIGZhbWlseSA9IHplcm9fb25lX2luZmxhdGVkX2JldGEoKSwKICBwcmlvciA9IHByaW9ycywKICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTksCiAgICAgICAgICAgICAgICAgbWF4X3RyZWVkZXB0aCA9IDEyKSwKICBjaGFpbnMgPSA0LCBpdGVyID0gNDAwMCwgd2FybXVwID0gMTAwMCwKICBjb3JlcyA9IDQsIHRocmVhZHMgPSB0aHJlYWRpbmcoMiksCiAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgc2VlZCA9IDEsCiAgZmlsZSA9ICJzaHJpbXBfb3V0X21vZGVsIgopCgpzdW1tYXJ5KHNocmltcF9vdXRfbW9kZWwpCmBgYAoKIyMjMi40LjEgTW9kZWwgZml0IGFuZCBkaWFnbm9zdGljcwojIyMjMi40LjEuMSBNb2RlbCBjb252ZXJnZW5jZQpgYGB7cn0KZXh0cmFjdF9yaGF0cyhzaHJpbXBfb3V0X21vZGVsKQpgYGAKCiMjIyMyLjQuMS4yIE1vZGVsIGZpdApgYGB7cn0KI3Bvc3RlcmlvciBwcmVkaWN0aXZlIGNoZWNrcwpwcF9jaGVjayhzaHJpbXBfb3V0X21vZGVsKQoKcHBfY2hlY2soc2hyaW1wX291dF9tb2RlbCwgdHlwZT0nc3RhdCcsIHN0YXQ9J21lYW4nKQoKI2ZpdHRlZCB2cyBwcmVkaWN0ZWQgdmFsdWVzCnN1bW1hcnkoZml0dGVkKHNocmltcF9vdXRfbW9kZWwpKQpzdW1tYXJ5KHByZWRpY3Qoc2hyaW1wX291dF9tb2RlbCkpCmBgYAoKIyMjMi40LjIgUG9zdGVyaW9yIG1hcmdpbmFsIGVmZmVjdHMKIyMjIzIuNC4yLjEgUGFpcndpc2UgY29udHJhc3RzIG9mIHN0cm9rZSBhbmQgc3RhZ2UKYGBge3J9CnNocmltcF9vdXRfY29udHJhc3RzIDwtIHNocmltcF9vdXRfbW9kZWwgfD4KICBlbW1lYW5zKH4gc3Ryb2tlKnN0YWdlLCAKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJlX2Zvcm1sYSA9IE5VTEwsCiAgICAgICAgICByZy5saW1pdCA9MTQwMDApIHw+IAogIGNvbnRyYXN0KG1ldGhvZCA9ICJyZXZwYWlyd2lzZSIpIAoKIyBFeHRyYWN0IHRoZSByZWxldmFudCBjb250cmFzdCBpbmZvcm1hdGlvbgpzaHJpbXBfb3V0X2NvbnRyYXN0cyA8LSBhcy5kYXRhLmZyYW1lKHNocmltcF9vdXRfY29udHJhc3RzKSB8PiAKICBkcGx5cjo6ZmlsdGVyKGNvbnRyYXN0ICVpbiUgYygiY29udHJvbCBQcmUgLSAyIFByZSIsICJjb250cm9sIFByZSAtIDQgUHJlIiwiNCBQcmUgLSAyIFByZSIsICJjb250cm9sIFByZSAtIGNvbnRyb2wgRHVyaW5nIiwgImNvbnRyb2wgUHJlIC0gY29udHJvbCBQb3N0IiwgIjQgUHJlIC0gNCBEdXJpbmciLCAiNCBQcmUgLSA0IFBvc3QiLCAiMiBQcmUgLSAyIER1cmluZyIsICIyIFByZSAtIDIgUG9zdCIpKQoKc2hyaW1wX291dF9jb250cmFzdHMKCnNocmltcF9vdXRfY29udHJhc3RfZHJhd3MgPC0gc2hyaW1wX291dF9tb2RlbCAgfD4KICBlbW1lYW5zKH4gc3Ryb2tlKnN0YWdlLCAKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSkgfD4gCiAgY29udHJhc3QobWV0aG9kID0gInJldnBhaXJ3aXNlIikgfD4gCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKQoKc2hyaW1wX291dF90ZW1wb3JhbF9jb250cmFzdHMgPC0gc2hyaW1wX291dF9jb250cmFzdF9kcmF3cyB8PiAKICBkcGx5cjo6ZmlsdGVyKGNvbnRyYXN0ICVpbiUgYygiY29udHJvbCBQcmUgLSBjb250cm9sIER1cmluZyIsICJjb250cm9sIFByZSAtIGNvbnRyb2wgUG9zdCIsICI0IFByZSAtIDQgRHVyaW5nIiwgIjQgUHJlIC0gNCBQb3N0IiwgIjIgUHJlIC0gMiBEdXJpbmciLCAiMiBQcmUgLSAyIFBvc3QiKSkgfD4gCiAgbXV0YXRlKHN0cm9rZSA9IGlmZWxzZShjb250cmFzdCAlaW4lIGMoImNvbnRyb2wgUHJlIC0gY29udHJvbCBEdXJpbmciLCAiY29udHJvbCBQcmUgLSBjb250cm9sIFBvc3QiKSwgIkNvbnRyb2wiLCBpZmVsc2UoY29udHJhc3QgJWluJSBjKCI0IFByZSAtIDQgRHVyaW5nIiwgIjQgUHJlIC0gNCBQb3N0IiksICI0IiwgIjIiKSkpCgpzaHJpbXBfb3V0X3RlbXBvcmFsX2NvbnRyYXN0cyRzdHJva2UgPC0gZmFjdG9yKHNocmltcF9vdXRfdGVtcG9yYWxfY29udHJhc3RzJHN0cm9rZSwgbGV2ZWxzID0gYygiQ29udHJvbCIsICI0IiwgIjIiKSkKCnNocmltcF9vdXRfdGVtcG9yYWxfY29udHJhc3RzX2ZpZyA8LSBnZ3Bsb3Qoc2hyaW1wX291dF90ZW1wb3JhbF9jb250cmFzdHMsIGFlcyh4ID0gLnZhbHVlLCB5ID0gZmFjdG9yKGNvbnRyYXN0LCBsZXZlbHMgPSBjKCJjb250cm9sIFByZSAtIGNvbnRyb2wgRHVyaW5nIiwgImNvbnRyb2wgUHJlIC0gY29udHJvbCBQb3N0IiwgIjQgUHJlIC0gNCBEdXJpbmciLCAiNCBQcmUgLSA0IFBvc3QiLCAgIjIgUHJlIC0gMiBEdXJpbmciLCAiMiBQcmUgLSAyIFBvc3QiKSksIGNvbG9yID0gc3Ryb2tlLCBmaWxsID0gc3Ryb2tlKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKwogIHN0YXRfaGFsZmV5ZSgud2lkdGggPSBjKDAuODksIDAuOTUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoY29sb3VyMTEsIGNvbG91cjEyLCBjb2xvdXIxMykpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBhbHBoYShjKGNvbG91cjEsIGNvbG91cjIsIGNvbG91cjMpLCAwLjgpKSArCiAgbGFicyh4ID0gIkRpZmZlcmVuY2UgaW4gdGhlIHByb3BvcnRpb24gb2YgdGltZSBzcGVudCBvdXQgb2YgdGhlIGJ1cnJvdyIsCiAgICAgICB5ID0gIkNvbnRyYXN0cyBvZiB0aGUgdGltZSBwZXJpb2RzIHJlbGF0aXZlIHRvIG5vaXNlIGV4cG9zdXJlIiwKICAgICAgIGZpbGwgPSAiTm9pc2UgdHJlYXRtZW50IiwgY29sb3IgPSAiTm9pc2UgdHJlYXRtZW50IiwKICAgICAgIGZpbGxfcmFtcCA9ICJDcmVkaWJsZSBpbnRlcnZhbCIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDUwLCBoanVzdCA9MSkpICsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscyA9IGMoIlByZSAtIER1cmluZyIsICJQcmUgLSBQb3N0IiwgIlByZSAtIER1cmluZyIsICJQcmUgLSBQb3N0IiwgIlByZSAtIER1cmluZyIsICJQcmUgLSBQb3N0IikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0wLjIsIDAuMywgMC4xKSwgbGFiZWxzID0gYygiLTAuMiIsIi0wLjEiICwgIjAiLCAiMC4xIiwgIjAuMiIsICIwLjMiKSwgbGltaXRzID0gYygtMC4zLCAwLjQpKSAKCgpzaHJpbXBfb3V0X3RlbXBvcmFsX2NvbnRyYXN0c19maWcKYGBgCgojIyMyLjQuMyBFeHRyYWN0aW5nIGFuZCBwbG90dGluZyBtb2RlbCBlc3RpbWF0ZXMKIyMjIzIuNC4zLjEgRXh0cmFjdGluZyBlc3RpbWF0ZXMKYGBge3J9CnNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzIDwtIHNocmltcF9vdXRfbW9kZWwgfD4gCiAgZW1tZWFucyh+IHN0cm9rZSpzdGFnZSwKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJnLmxpbWl0ID0gMTQwMDAsCiAgICAgICAgICByZV9mb3JtdWxhID0gTkEpCgpzaHJpbXBfb3V0X21vZGVsX2VzdGltYXRlcyA8LSBhcy5kYXRhLmZyYW1lKHNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzKQoKc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXMKCiNTdG9yaW5nIHRoZSBtb2RlbCBlc3RpbWF0ZSBtZWFucyBmb3IgZWFjaCBncm91cCB0byBwbG90IGxhdGVyIG9uCnNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzX2NvbnRyb2wgPC0gc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXMgfD4gCiAgZHBseXI6OmZpbHRlcihzdHJva2UgPT0gImNvbnRyb2wiKSB8PiAKICByZW5hbWUoLnZhbHVlID0gZW1tZWFuKQoKc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXNfZm91ciA8LSBzaHJpbXBfb3V0X21vZGVsX2VzdGltYXRlcyB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSAiNCIpfD4gCiAgcmVuYW1lKC52YWx1ZSA9IGVtbWVhbikKCnNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzX3R3byA8LSBzaHJpbXBfb3V0X21vZGVsX2VzdGltYXRlcyB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSAiMiIpfD4gCiAgcmVuYW1lKC52YWx1ZSA9IGVtbWVhbikKYGBgCiMjIyMyLjQuMy4yIFBsb3R0aW5nIG1vZGVsIGVzdGltYXRlcyBhbmQgcmF3IGRhdGEKYGBge3J9CnNocmltcF9vdXRfbW9kZWxfZHJhd3MgPC0gc2hyaW1wX291dF9tb2RlbCB8PiAKICBlbW1lYW5zKH4gc3Ryb2tlKnN0YWdlLAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmcubGltaXQgPSAxNDAwMCwKICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSkgfD4gCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKQoKc2hyaW1wX291dF9tb2RlbF9kcmF3cyA8LSBzaHJpbXBfb3V0X21vZGVsX2RyYXdzIHw+IAogIHJlbmFtZShlbW1lYW4gPSAudmFsdWUpCgpzaHJpbXBfb3V0X3Jhd19kYXRhIDwtIGZpbmFsX2RmIHw+IAogIHJlbmFtZShlbW1lYW4gPSBzaHJpbXBfb3V0KQoKc2hyaW1wX291dF9yYXdfZGF0YSRzdGFnZSA8LSBmYWN0b3Ioc2hyaW1wX291dF9yYXdfZGF0YSRzdGFnZSwgbGV2ZWxzID0gYygiUHJlIiwgIkR1cmluZyIsICJQb3N0IikpCnNocmltcF9vdXRfcmF3X2RhdGEkc3Ryb2tlIDwtIGZhY3RvcihzaHJpbXBfb3V0X3Jhd19kYXRhJHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0IiwgIjIiKSkKCnNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzJHN0YWdlIDwtIGZhY3RvcihzaHJpbXBfb3V0X21vZGVsX2VzdGltYXRlcyRzdGFnZSwgbGV2ZWxzID0gYygiUHJlIiwgIkR1cmluZyIsICJQb3N0IikpCnNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzJHN0cm9rZSA8LSBmYWN0b3Ioc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXMkc3Ryb2tlLCBsZXZlbHMgPSBjKCJjb250cm9sIiwgIjQiLCAiMiIpKQoKc2hyaW1wX291dF9tb2RlbF9kcmF3cyRzdGFnZSA8LSBmYWN0b3Ioc2hyaW1wX291dF9tb2RlbF9kcmF3cyRzdGFnZSwgbGV2ZWxzID0gYygiUHJlIiwgIkR1cmluZyIsICJQb3N0IikpCnNocmltcF9vdXRfbW9kZWxfZHJhd3Mkc3Ryb2tlIDwtIGZhY3RvcihzaHJpbXBfb3V0X21vZGVsX2RyYXdzJHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0IiwgIjIiKSkKCnNocmltcF9vdXRfbWVhbnMgPC0gc2hyaW1wX291dF9yYXdfZGF0YSB8PiAKICBncm91cF9ieShzdGFnZSwgc3Ryb2tlKSB8PiAKICBzdW1tYXJpc2UoZW1tZWFuID0gbWVhbihlbW1lYW4pKQoKCnNocmltcF9vdXRfZmlnX3RvZ2V0aGVyIDwtIGdncGxvdChkYXRhID0gc2hyaW1wX291dF9yYXdfZGF0YSwgYWVzKHggPSBzdGFnZSwgeSA9IGVtbWVhbiwgY29sb3IgPSBzdHJva2UsIGZpbGwgPSBzdHJva2UpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gc2hyaW1wX291dF9tZWFucywgYWxwaGEgPSAxLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlbnVkZ2Uod2lkdGggPSAwLjgsIHggPSAtMC4wOSksIHNpemUgPSA5LCBzaGFwZSA9ICJfIikgKwogIGdlb21faGFsZl9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZW51ZGdlKHdpZHRoID0gMC44LCB4ID0gLTAuMDMpLCBzaWRlID0gImwiLCByYW5nZV9zY2FsZSA9IDAuNSkgKwogIGdlb21faGFsZl92aW9saW4oZGF0YSA9IHNocmltcF9vdXRfbW9kZWxfZHJhd3MsIGFlcyh4ID0gc3RhZ2UsIHkgPSBlbW1lYW4sIGNvbG9yID0gc3Ryb2tlLCBmaWxsID0gc3Ryb2tlKSwgYWxwaGEgPSAwLjYsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCBzaWRlID0gInIiLCBzaXplID0gMCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzLCBhZXMoeCA9IHN0YWdlLCB5ID0gZW1tZWFuLCBjb2xvciA9IHN0cm9rZSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoZGF0YSA9IHNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzLCBhZXMoeCA9IHN0YWdlLCB5ID0gZW1tZWFuLCB5bWluID0gbG93ZXIuSFBELCB5bWF4ID0gdXBwZXIuSFBELCBjb2xvciA9IHN0cm9rZSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCB3aWR0aCA9IDAsIHNpemUgPSAxLjI1KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiY29udHJvbCIgPSAiIzc2QTM0QSIsICI0IiA9ICIjRjI5RTAwIiwgIjIiID0gIiNFMjVBMDAiKSwgbmFtZSA9ICJOb2lzZSBleHBvc3VyZSIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMpKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJjb250cm9sIiA9ICIjMkEzMzBFIiwgIjQiID0gIiM4MDUyMTMiLCAiMiIgPSAiIzU0MjcwOSIpLCBuYW1lID0gIk5vaXNlIGV4cG9zdXJlIiwgZ3VpZGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMykpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJQcmUiLCAiRHVyaW5nIiwgIlBvc3QiKSkgKwogIGxhYnModGl0bGUgPSAiVGhlIGVmZmVjdHMgb2YgYm9hdCBub2lzZSBvbiBzaHJpbXAgYnVycm93IHVzZSIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgdGltZSBpbiBvdXQgb2YgdGhlIGJ1cnJvdyIsCiAgICAgICB4ID0gIkV4cGVyaW1lbnRhbCBwaGFzZSByZWxhdGl2ZSB0byBub2lzZSBleHBvc3VyZSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDUpKSwgIAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBtYXJnaW4gPSBtYXJnaW4ociA9IDUpKSwgIAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgbWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgbWFyZ2luID0gbWFyZ2luKHIgPSAxMCkpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gInRvcCIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYpLCAgCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxMCwgMTAsIDEwLCAxMCkKICApCgpzaHJpbXBfb3V0X2ZpZ190b2dldGhlcgpgYGAKCgojIyMjMi40LjMuMyBQbG90dGluZyBjb250cm9sIGVzdGltYXRlcyBhbmQgcmF3IGRhdGEKYGBge3J9CnNocmltcF9vdXRfbW9kZWxfZHJhd3MgPC0gc2hyaW1wX291dF9tb2RlbCB8PiAKICBlbW1lYW5zKH4gc3Ryb2tlKnN0YWdlLAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmcubGltaXQgPSAxNDAwMCwKICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSkgfD4gCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKQoKc2hyaW1wX291dF9yYXdfZGF0YSA8LSBmaW5hbF9kZiB8PgogIHJlbmFtZSgudmFsdWUgPSBzaHJpbXBfb3V0KQoKc2hyaW1wX291dF9tb2RlbF9kcmF3cyRzdGFnZSA8LSBmYWN0b3Ioc2hyaW1wX291dF9tb2RlbF9kcmF3cyRzdGFnZSwgbGV2ZWxzID0gYygiUHJlIiwgIkR1cmluZyIsICJQb3N0IikpCnNocmltcF9vdXRfbW9kZWxfZHJhd3Mkc3Ryb2tlIDwtIGZhY3RvcihzaHJpbXBfb3V0X21vZGVsX2RyYXdzJHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0IiwgIjIiKSkKCnNocmltcF9vdXRfY29udHJvbF9tb2RlbF9kcmF3cyA8LSBzaHJpbXBfb3V0X21vZGVsX2RyYXdzIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ICJjb250cm9sIikKCnNocmltcF9jb250cm9sX3Jhd19kYXRhIDwtIGZpbmFsX2RmIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ImNvbnRyb2wiKSB8PiAKICByZW5hbWUoLnZhbHVlID0gc2hyaW1wX291dCkKCnNocmltcF9jb250cm9sX21lYW5zIDwtIHNocmltcF9jb250cm9sX3Jhd19kYXRhIHw+IAogIGdyb3VwX2J5KHN0YWdlKSB8PiAKICBzdW1tYXJpc2UoLnZhbHVlID0gbWVhbigudmFsdWUpKQoKc2hyaW1wX2NvbnRyb2xfcmF3X2RhdGEkc3RhZ2UgPC0gZmFjdG9yKHNocmltcF9jb250cm9sX3Jhd19kYXRhJHN0YWdlLCBsZXZlbHMgPSBjKCJQcmUiLCAiRHVyaW5nIiwgIlBvc3QiKSkKCiNhc3NpZ25pbmcgYSB2YWx1ZSBmb3IgdGhlIGJhc2VsaW5lIG1lYW4Kc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXNfY29udHJvbF9pbnRlcmNlcHQgPC0gc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXNfY29udHJvbCAlPiUKICBkcGx5cjo6ZmlsdGVyKHN0YWdlID09ICJQcmUiKSAlPiUKICBwdWxsKC52YWx1ZSkKCnNocmltcF9vdXRfZmlnX2NvbnRyb2wgPC0gZ2dwbG90KHNocmltcF9jb250cm9sX3Jhd19kYXRhLCBhZXMoeSA9IC52YWx1ZSwgeCA9IHN0YWdlLCBmaWxsID0gc3RhZ2UsIGNvbG9yID0gc3RhZ2UpKSArCiAgZ2VvbV9oYWxmX3Zpb2xpbihkYXRhID0gc2hyaW1wX291dF9jb250cm9sX21vZGVsX2RyYXdzLCBhbHBoYSA9IDAuNywgc2l6ZSA9IDAsIHNpZGUgPSAiciIsIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAuMikpICsKICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcm51ZGdlKHggPSAtMC4xLCB3aWR0aCA9IDAuMSwgbnVkZ2UuZnJvbSA9ICJqaXR0ZXJlZCIpLCBhbHBoYSA9IDAuNCwgc2l6ZSA9IDIpICsKICBnZW9tX2Nyb3NzYmFyKGFscGhhID0gMC42LCBzaXplID0gMC44LCBkYXRhID0gc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXNfY29udHJvbCwgYWVzKHltaW4gPSBsb3dlci5IUEQsIHltYXggPSB1cHBlci5IUEQpLCB3aWR0aCA9IDAsIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAuMikpKwogIGdlb21fcG9pbnQocGNoID0gMjMsIHN0cm9rZSA9IDEuMiwgZGF0YSA9IHNocmltcF9vdXRfbW9kZWxfZXN0aW1hdGVzX2NvbnRyb2wsIHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gc2hyaW1wX2NvbnRyb2xfbWVhbnMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2VudWRnZSh3aWR0aCA9IDAuOCwgeCA9IC0wLjEpLCBzaXplID0gOSwgc2hhcGUgPSAiXyIpICsKICBsYWJzKHg9IlBlcmlvZCByZWxhdGl2ZSB0byB0cmVhdG1lbnQiLAogICAgICAgeT0iUHJvcG9ydGlvbiBvZiB0aW1lIG91dCBvZiBidXJyb3ciKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMyksICAKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCBiID0gMCwgbCA9IDAsIHIgPSAxMCkpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHRib3hfc2ltcGxlKGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNiwgaGFsaWduID0gMC41LCBsaW5ld2lkdGggPSAwLjMsIGxpbmV0eXBlID0gMSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIiNBM0MwODgiLCBwYWRkaW5nID0gbWFyZ2luKDUsIDUsIDUsIDUpKSwgCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gTkEpKSsKICBnZ3RpdGxlKCJDb250cm9sIikrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiUHJlIiA9ICJkYXJrZ3JleSIsICJEdXJpbmciID0gIiM3NkEzNEEiLCAiUG9zdCIgPSAiI0QzRDlBNyIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIlByZSIgPSAiIzI0MjQyNCIsICJEdXJpbmciID0gIiMyQTMzMEUiLCAiUG9zdCIgPSAiIzVkNjM0YyIpKQoKc2hyaW1wX291dF9maWdfY29udHJvbApgYGAKIyMjIzIuNC4zLjQgUGxvdHRpbmcgNC1zdHJva2UgZXN0aW1hdGVzIGFuZCByYXcgZGF0YQpgYGB7cn0Kc2hyaW1wX291dF9jb250cm9sX21vZGVsX2RyYXdzIDwtIHNocmltcF9vdXRfbW9kZWxfZHJhd3MgfD4gCiAgZHBseXI6OmZpbHRlcihzdHJva2UgPT0gIjQiKQoKc2hyaW1wX2ZvdXJfcmF3X2RhdGEgPC0gZmluYWxfZGYgfD4gCiAgZHBseXI6OmZpbHRlcihzdHJva2UgPT0iNCIpIHw+IAogIHJlbmFtZSgudmFsdWUgPSBzaHJpbXBfb3V0KQoKc2hyaW1wX2ZvdXJfcmF3X2RhdGEkc3RhZ2UgPC0gZmFjdG9yKHNocmltcF9mb3VyX3Jhd19kYXRhJHN0YWdlLCBsZXZlbHMgPSBjKCJQcmUiLCAiRHVyaW5nIiwgIlBvc3QiKSkKCnNocmltcF9mb3VyX21lYW5zIDwtIHNocmltcF9mb3VyX3Jhd19kYXRhIHw+IAogIGdyb3VwX2J5KHN0YWdlKSB8PiAKICBzdW1tYXJpc2UoLnZhbHVlID0gbWVhbigudmFsdWUpKQoKc2hyaW1wX291dF9maWdfZm91ciA8LSBnZ3Bsb3Qoc2hyaW1wX2ZvdXJfcmF3X2RhdGEsIGFlcyh5ID0gLnZhbHVlLCB4ID0gc3RhZ2UsIGZpbGwgPSBzdGFnZSwgY29sb3IgPSBzdGFnZSkpICsKICBnZW9tX2hhbGZfdmlvbGluKGRhdGEgPSBzaHJpbXBfb3V0X2NvbnRyb2xfbW9kZWxfZHJhd3MsIGFscGhhID0gMC43LCBzaXplID0gMCwgc2lkZSA9ICJyIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gMC4yKSkgKwogIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVybnVkZ2UoeCA9IC0wLjEsIHdpZHRoID0gMC4xLCBudWRnZS5mcm9tID0gImppdHRlcmVkIiksIGFscGhhID0gMC40LCBzaXplID0gMikgKwogIGdlb21fY3Jvc3NiYXIoYWxwaGEgPSAwLjYsIHNpemUgPSAwLjgsIGRhdGEgPSBzaHJpbXBfb3V0X21vZGVsX2VzdGltYXRlc19mb3VyLCBhZXMoeW1pbiA9IGxvd2VyLkhQRCwgeW1heCA9IHVwcGVyLkhQRCksIHdpZHRoID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gMC4yKSkrCiAgZ2VvbV9wb2ludChwY2ggPSAyMywgc3Ryb2tlID0gMS4yLCBkYXRhID0gc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXNfZm91ciwgc2l6ZSA9IDIsIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAuMikpICsKICBnZW9tX3BvaW50KGRhdGEgPSBzaHJpbXBfZm91cl9tZWFucywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZW51ZGdlKHdpZHRoID0gMC44LCB4ID0gLTAuMSksIHNpemUgPSA5LCBzaGFwZSA9ICJfIikgKwogIHhsYWIoIkV4cGVyaW1lbnRhbCBwaGFzZSByZWxhdGl2ZSB0byBub2lzZSBleHBvc3VyZSIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCAgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSwgIAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiwgbWFyZ2luID0gbWFyZ2luKHQgPSAxNSwgYiA9IDAsIGwgPSAwLCByID0gMCkpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHRib3hfc2ltcGxlKGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNiwgaGFsaWduID0gMC41LCBsaW5ld2lkdGggPSAwLjMsIGxpbmV0eXBlID0gMSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIiNGNkJDNjUiLCBwYWRkaW5nID0gbWFyZ2luKDUsIDUsIDUsIDUpKSwgCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gTkEpKSsKICBnZ3RpdGxlKCI0LXN0cm9rZSIpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlByZSIgPSAiZGFya2dyZXkiLCAiRHVyaW5nIiA9ICIjRjI5RTAwIiwgIlBvc3QiID0gIiNGMkQ1QTAiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJQcmUiID0gIiMyNDI0MjQiLCAiRHVyaW5nIiA9ICIjODA1MjEzIiwgIlBvc3QiID0gIiM3MDUzMmIiKSkKCnNocmltcF9vdXRfZmlnX2ZvdXIKYGBgCgojIyMjMi40LjMuNSBQbG90dGluZyAyLXN0cm9rZSBlc3RpbWF0ZXMgYW5kIHJhdyBkYXRhCmBgYHtyfQpzaHJpbXBfb3V0X2NvbnRyb2xfbW9kZWxfZHJhd3MgPC0gc2hyaW1wX291dF9tb2RlbF9kcmF3cyB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSAiMiIpCgpzaHJpbXBfdHdvX3Jhd19kYXRhIDwtIGZpbmFsX2RmIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09IjIiKSB8PiAKICByZW5hbWUoLnZhbHVlID0gc2hyaW1wX291dCkKCnNocmltcF90d29fcmF3X2RhdGEkc3RhZ2UgPC0gZmFjdG9yKHNocmltcF90d29fcmF3X2RhdGEkc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKQoKc2hyaW1wX3R3b19tZWFucyA8LSBzaHJpbXBfdHdvX3Jhd19kYXRhIHw+IAogIGdyb3VwX2J5KHN0YWdlKSB8PiAKICBzdW1tYXJpc2UoLnZhbHVlID0gbWVhbigudmFsdWUpKQoKc2hyaW1wX291dF9maWdfdHdvIDwtIGdncGxvdChzaHJpbXBfdHdvX3Jhd19kYXRhLCBhZXMoeSA9IC52YWx1ZSwgeCA9IHN0YWdlLCBmaWxsID0gc3RhZ2UsIGNvbG9yID0gc3RhZ2UpKSArCiAgZ2VvbV9oYWxmX3Zpb2xpbihkYXRhID0gc2hyaW1wX291dF9jb250cm9sX21vZGVsX2RyYXdzLCBhbHBoYSA9IDAuNywgc2l6ZSA9IDAsIHNpZGUgPSAiciIsIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAuMikpICsKICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcm51ZGdlKHggPSAtMC4xLCB3aWR0aCA9IDAuMSwgbnVkZ2UuZnJvbSA9ICJqaXR0ZXJlZCIpLCBhbHBoYSA9IDAuNCwgc2l6ZSA9IDIpICsKICBnZW9tX2Nyb3NzYmFyKGFscGhhID0gMC42LCBzaXplID0gMC44LCBkYXRhID0gc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXNfdHdvLCBhZXMoeW1pbiA9IGxvd2VyLkhQRCwgeW1heCA9IHVwcGVyLkhQRCksIHdpZHRoID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gMC4yKSkrCiAgZ2VvbV9wb2ludChwY2ggPSAyMywgc3Ryb2tlID0gMS4yLCBkYXRhID0gc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXNfdHdvLCBzaXplID0gMiwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gMC4yKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHNocmltcF90d29fbWVhbnMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2VudWRnZSh3aWR0aCA9IDAuOCwgeCA9IC0wLjEpLCBzaXplID0gOSwgc2hhcGUgPSAiXyIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMyksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHRib3hfc2ltcGxlKGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNiwgaGFsaWduID0gMC41LCBsaW5ld2lkdGggPSAwLjMsIGxpbmV0eXBlID0gMSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIiNFQjkwNjMiLCBwYWRkaW5nID0gbWFyZ2luKDUsIDUsIDUsIDUpKSwgCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gTkEpKSsKICBnZ3RpdGxlKCIyLXN0cm9rZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJQcmUiID0gImRhcmtncmV5IiwgIkR1cmluZyIgPSAiI0UyNUEwMCIsICJQb3N0IiA9ICIjRjJCMzg5IikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiUHJlIiA9ICIjMjQyNDI0IiwgIkR1cmluZyIgPSAiIzU0MjcwOSIsICJQb3N0IiA9ICIjNjY0MjJhIikpCgpzaHJpbXBfb3V0X2ZpZ190d28KYGBgCiMjIyMyLjQuMy42IENvbWJpbmluZyBwbG90cyBpbnRvIG9uZSBmaWd1cmUKYGBge3J9CnNocmltcF9vdXRfcGxvdDMgPC0gc2hyaW1wX291dF9maWdfY29udHJvbCArIHNocmltcF9vdXRfZmlnX2ZvdXIgKyBzaHJpbXBfb3V0X2ZpZ190d28gKyAKICBwbG90X2xheW91dChuY29sID0gMykKCnNocmltcF9vdXRfcGxvdDMKZ2dzYXZlKCIuLzMtZmlncy9zaHJpbXBfb3V0X3Bsb3QzLmpwZWciLCBwbG90ID0gc2hyaW1wX291dF9wbG90MywgdW5pdHMgPSAicHgiLCB3aWR0aCA9IDIyMDAsIGhlaWdodCA9IDE0MDAsIGRwaSA9IDMwMCkKYGBgCgojIyMyLjQuNCBFZmZlY3RzIG9mIGNvdmFyaWF0ZXMgb24gdGhlIHByb3BvcnRpb24gb2YgdGltZSBzaHJpbXAgc3BlbnQgb3V0c2lkZSBvZiB0aGUgYnVycm93CiMjIyMyLjQuNC4xIEdvYnkgbnVtYmVyCmBgYHtyfQpzaHJpbXBfb3V0X2dvYnlfbnVtYmVyX2NvbnRyYXN0cyA8LSBzaHJpbXBfb3V0X21vZGVsIHw+CiAgZW1tZWFucyh+IGdvYnlfbnVtYmVyLCAKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJlX2Zvcm1sYSA9IE5VTEwsCiAgICAgICAgICByZy5saW1pdCA9MTQwMDApIHw+IAogIGNvbnRyYXN0KG1ldGhvZCA9ICJyZXZwYWlyd2lzZSIpIAoKc2hyaW1wX291dF9nb2J5X251bWJlcl9jb250cmFzdHMKYGBgCgojIyMjMi40LjQuMiBTaHJpbXAgbnVtYmVyCmBgYHtyfQpzaHJpbXBfb3V0X3NocmltcF9udW1iZXJfY29udHJhc3RzIDwtIHNocmltcF9vdXRfbW9kZWwgfD4KICBlbW1lYW5zKH4gc2hyaW1wX251bWJlciwgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMLAogICAgICAgICAgcmcubGltaXQgPTE0MDAwKSB8PiAKICBjb250cmFzdChtZXRob2QgPSAicmV2cGFpcndpc2UiKSAKCnNocmltcF9vdXRfc2hyaW1wX251bWJlcl9jb250cmFzdHMgPC0gYXMuZGF0YS5mcmFtZShzaHJpbXBfb3V0X3NocmltcF9udW1iZXJfY29udHJhc3RzKQoKc2hyaW1wX291dF9zaHJpbXBfbnVtYmVyX2VzdGltYXRlcyA8LSBzaHJpbXBfb3V0X21vZGVsIHw+CiAgZW1tZWFucyh+IHNocmltcF9udW1iZXIsIAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmVfZm9ybWxhID0gTlVMTCwKICAgICAgICAgIHJnLmxpbWl0ID0xNDAwMCkKCnNocmltcF9vdXRfc2hyaW1wX251bWJlcl9lc3RpbWF0ZXMKCnNocmltcF9vdXRfc2hyaW1wX251bWJlcl9jb250cmFzdF9kcmF3cyA8LSBzaHJpbXBfb3V0X21vZGVsIHw+CiAgZW1tZWFucyh+IHNocmltcF9udW1iZXIsIAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmVfZm9ybWxhID0gTlVMTCwKICAgICAgICAgIHJnLmxpbWl0ID0xNDAwMCkgfD4gCiAgY29udHJhc3QobWV0aG9kID0gInJldnBhaXJ3aXNlIikgfD4gCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKQoKZ2dwbG90KGRhdGEgPSBzaHJpbXBfb3V0X3NocmltcF9udW1iZXJfY29udHJhc3RfZHJhd3MsIGFlcyh4ID0gY29udHJhc3QsIHkgPSAudmFsdWUgKSkgKwogIHN0YXRfaGFsZmV5ZSgpCmBgYAojIyMjMi40LjQuMyBTaHJpbXAgc3BlY2llcwpgYGB7cn0Kc2hyaW1wX291dF9zaHJpbXBfc3BlY2llc19jb250cmFzdHMgPC0gc2hyaW1wX291dF9tb2RlbCB8PgogIGVtbWVhbnMofiBzaHJpbXBfc3BlY2llcywgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMLAogICAgICAgICAgcmcubGltaXQgPTE0MDAwKSB8PiAKICBjb250cmFzdChtZXRob2QgPSAicmV2cGFpcndpc2UiKSAKCnNocmltcF9vdXRfc2hyaW1wX3NwZWNpZXNfY29udHJhc3RzCgpzaHJpbXBfb3V0X3NocmltcF9zcGVjaWVzX2NvbnRyYXN0c19kcmF3cyA8LSBzaHJpbXBfb3V0X21vZGVsIHw+CiAgZW1tZWFucyh+IHNocmltcF9zcGVjaWVzLCAKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJlX2Zvcm1sYSA9IE5VTEwsCiAgICAgICAgICByZy5saW1pdCA9MTQwMDApIHw+IAogIGNvbnRyYXN0KG1ldGhvZCA9ICJyZXZwYWlyd2lzZSIpIHw+IAogIGdhdGhlcl9lbW1lYW5zX2RyYXdzKCkKCmdncGxvdChkYXRhID0gc2hyaW1wX291dF9zaHJpbXBfc3BlY2llc19jb250cmFzdHNfZHJhd3MsIGFlcyh4ID0gY29udHJhc3QsIHkgPSAudmFsdWUgKSkgKwogIHN0YXRfaGFsZmV5ZSgpCmBgYAoKIyMyLjUgTW9kZWxsaW5nIHRoZSBwcm9wb3J0aW9uIG9mIHRpbWUgc2hyaW1wIHNwZW50IGluIGNvbnRhY3Qgd2l0aCB0aGUgZ29ieQojIyMyLjUuMSBDaGVja2luZyB0aGUgcmVzcG9uc2UgdmFyaWFibGUgZGlzdHJpYnV0aW9uCmBgYHtyfQpzaHJpbXBfY29udGFjdF9kZiA8LSBmaW5hbF9kZiB8PiAKICBtdXRhdGUoaXNfemVybyA9IHNocmltcF9jb250YWN0ID09IDApCgpzaHJpbXBfY29udGFjdF9wbG90IDwtIHNocmltcF9jb250YWN0X2RmIHw+IAogIG11dGF0ZShzaHJpbXBfY29udGFjdCA9IGlmZWxzZShpc196ZXJvLCAtMC4xLCBzaHJpbXBfY29udGFjdCkpIHw+IAogIGdncGxvdChhZXMoeCA9IHNocmltcF9jb250YWN0KSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsID0gaXNfemVybyksIGJpbndpZHRoID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKQpzaHJpbXBfY29udGFjdF9wbG90CiMgRGlzdHJpYnV0aW9uIGlzIGEgemVyby1vbmUgaW5mbGF0ZWQgYmV0YSBkaXN0cmlidXRpb24sIGJlY2F1c2UgdGhlIHZhbHVlIGZvciBzaHJpbXBfY29udGFjdCBpcyBib3VuZGVkIGJ5IDAtMSBhcyBpdCBpcyBhIHByb3BvcnRpb24gb2YgdGhlIHRvdGFsIHRpbWUgYW5kIHRoZXJlIGlzIHZhbHVlcyBvZiAwIGFuZCAxLgpgYGAKCiMjIzIuNS4yIFJ1bm5pbmcgdGhlIG1vZGVsCmBgYHtyfQpzaHJpbXBfY29udGFjdF9tb2RlbCA8LSBicm0oCiAgYmYoc2hyaW1wX2NvbnRhY3QgfiBzdHJva2Uqc3RhZ2UgKyBzaHJpbXBfbnVtYmVyICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxfHNpdGUvYnVycm93KSwKICAgICBwaGkgfiBzdHJva2Uqc3RhZ2UgKyBzaHJpbXBfbnVtYmVyICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxfHNpdGUvYnVycm93KSwKICAgICB6b2kgfiBzdHJva2Uqc3RhZ2UgKyBzaHJpbXBfbnVtYmVyICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxfHNpdGUvYnVycm93KSwKICAgICBjb2kgfiBzdHJva2Uqc3RhZ2UgKyBzaHJpbXBfbnVtYmVyICsgZ29ieV9udW1iZXIgKyBzaHJpbXBfc3BlY2llcyArICgxfHNpdGUvYnVycm93KQogICAgICksCiAgZGF0YSA9IGZpbmFsX2RmLAogIHByaW9yID0gcHJpb3JzLAogIGZhbWlseSA9IHplcm9fb25lX2luZmxhdGVkX2JldGEoKSwKICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTksIG1heF90cmVlZGVwdGggPSAxMiksCiAgY2hhaW5zID0gNCwgaXRlciA9IDYwMDAsIHdhcm11cCA9IDEwMDAsIHNlZWQgPSAxLCBiYWNrZW5kID0gImNtZHN0YW5yIiwgY29yZXMgPSA0LCB0aHJlYWRzID0gdGhyZWFkaW5nKDIpLAogIGZpbGUgPSAic2hyaW1wX2NvbnRhY3RfbW9kZWwiCikKCnN1bW1hcnkoc2hyaW1wX2NvbnRhY3RfbW9kZWwpCmBgYAoKIyMjMi41LjMgTW9kZWwgZml0IGFuZCBkaWFnbm9zdGljcwojIyMjMi41LjMuMSBNb2RlbCBjb252ZXJnZW5jZQpgYGB7cn0KZXh0cmFjdF9yaGF0cyhzaHJpbXBfY29udGFjdF9tb2RlbCkKYGBgCgojIyMjMi41LjMuMiBNb2RlbCBmaXQKYGBge3J9CiNwb3N0ZXJpb3IgcHJlZGljdGl2ZSBjaGVja3MKcHBfY2hlY2soc2hyaW1wX2NvbnRhY3RfbW9kZWwpCgpwcF9jaGVjayhzaHJpbXBfY29udGFjdF9tb2RlbCwgdHlwZT0nc3RhdCcsIHN0YXQ9J21lYW4nKQoKI2ZpdHRlZCB2cyBwcmVkaWN0ZWQgdmFsdWVzCnN1bW1hcnkoZml0dGVkKHNocmltcF9jb250YWN0X21vZGVsKSkKc3VtbWFyeShwcmVkaWN0KHNocmltcF9jb250YWN0X21vZGVsKSkKYGBgCgojIyMyLjUuMiBQb3N0ZXJpb3IgbWFyZ2luYWwgZWZmZWN0cwojIyMjMi41LjIuMSBQYWlyd2lzZSBjb250cmFzdHMgb2Ygc3Ryb2tlIGFuZCBzdGFnZQpgYGB7cn0Kc2hyaW1wX2NvbnRhY3RfY29udHJhc3RzIDwtIHNocmltcF9jb250YWN0X21vZGVsIHw+CiAgZW1tZWFucyh+IHN0cm9rZSpzdGFnZSwgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMLAogICAgICAgICAgcmcubGltaXQgPTE0MDAwKSB8PiAKICBjb250cmFzdChtZXRob2QgPSAicmV2cGFpcndpc2UiKSAKCm92ZXJhbGxfbWVhbiA8LSBzaHJpbXBfY29udGFjdF9tb2RlbCB8PgogIGVtbWVhbnMofiAxLCAgICAgICAgICAgICAjIDEgbWVhbnMgIm5vIGZhY3RvcnMsIiBpLmUuIHRoZSBncmFuZCBtZWFuCiAgICAgICAgICBlcHJlZCA9IFRSVUUsICAgICMgZXN0aW1hdGUgb24gdGhlIHJlc3BvbnNlIHNjYWxlCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMLAogICAgICAgICAgcmcubGltaXQgPSAxNDAwMCkKCiMgVmlldyB0aGUgc3VtbWFyeSB3aXRoIHBvc3RlcmlvciBtZWFuIGFuZCBjcmVkaWJsZSBpbnRlcnZhbHMKb3ZlcmFsbF9tZWFuCgojIEV4dHJhY3QgdGhlIHJlbGV2YW50IGNvbnRyYXN0IGluZm9ybWF0aW9uCnNocmltcF9jb250YWN0X2NvbnRyYXN0cyA8LSBhcy5kYXRhLmZyYW1lKHNocmltcF9jb250YWN0X2NvbnRyYXN0cykgfD4gCiAgZHBseXI6OmZpbHRlcihjb250cmFzdCAlaW4lIGMoImNvbnRyb2wgUHJlIC0gMiBQcmUiLCAiY29udHJvbCBQcmUgLSA0IFByZSIsIjQgUHJlIC0gMiBQcmUiLCAiY29udHJvbCBQcmUgLSBjb250cm9sIER1cmluZyIsICJjb250cm9sIFByZSAtIGNvbnRyb2wgUG9zdCIsICI0IFByZSAtIDQgRHVyaW5nIiwgIjQgUHJlIC0gNCBQb3N0IiwgIjIgUHJlIC0gMiBEdXJpbmciLCAiMiBQcmUgLSAyIFBvc3QiKSkKCnNocmltcF9jb250YWN0X2NvbnRyYXN0cwoKc2hyaW1wX2NvbnRhY3RfY29udHJhc3RzX2RyYXdzIDwtIHNocmltcF9jb250YWN0X21vZGVsICB8PgogIGVtbWVhbnMofiBzdHJva2Uqc3RhZ2UsIAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmVfZm9ybXVsYSA9IE5BKSB8PiAKICBjb250cmFzdChtZXRob2QgPSAicmV2cGFpcndpc2UiKSB8PiAKICBnYXRoZXJfZW1tZWFuc19kcmF3cygpCgpzaHJpbXBfY29udGFjdF90ZW1wb3JhbF9jb250cmFzdHMgPC0gc2hyaW1wX2NvbnRhY3RfY29udHJhc3RzX2RyYXdzIHw+IAogIGRwbHlyOjpmaWx0ZXIoY29udHJhc3QgJWluJSBjKCJjb250cm9sIFByZSAtIGNvbnRyb2wgRHVyaW5nIiwgImNvbnRyb2wgUHJlIC0gY29udHJvbCBQb3N0IiwiY29udHJvbCBQb3N0IC0gY29udHJvbCBEdXJpbmciICwgIjQgUHJlIC0gNCBEdXJpbmciLCAiNCBQcmUgLSA0IFBvc3QiLCAiNCBQb3N0IC0gNCBEdXJpbmciLCAiMiBQcmUgLSAyIER1cmluZyIsICIyIFByZSAtIDIgUG9zdCIsICIyIFBvc3QgLSAyIER1cmluZyIpKSB8PiAKICBtdXRhdGUoc3Ryb2tlID0gaWZlbHNlKGNvbnRyYXN0ICVpbiUgYygiY29udHJvbCBQcmUgLSBjb250cm9sIER1cmluZyIsICJjb250cm9sIFByZSAtIGNvbnRyb2wgUG9zdCIsImNvbnRyb2wgUG9zdCAtIGNvbnRyb2wgRHVyaW5nIiksICJDb250cm9sIiwgaWZlbHNlKGNvbnRyYXN0ICVpbiUgYygiNCBQcmUgLSA0IER1cmluZyIsICI0IFByZSAtIDQgUG9zdCIsICI0IFBvc3QgLSA0IER1cmluZyIpLCAiNCIsICIyIikpKQoKc2hyaW1wX2NvbnRhY3RfdGVtcG9yYWxfY29udHJhc3RzJHN0cm9rZSA8LSBmYWN0b3Ioc2hyaW1wX2NvbnRhY3RfdGVtcG9yYWxfY29udHJhc3RzJHN0cm9rZSwgbGV2ZWxzID0gYygiQ29udHJvbCIsICI0IiwgIjIiKSkKCnNocmltcF9jb250YWN0X3RlbXBvcmFsX2ZpZzwtIGdncGxvdChzaHJpbXBfY29udGFjdF90ZW1wb3JhbF9jb250cmFzdHMsIGFlcyh4ID0gLnZhbHVlLCB5ID0gZmFjdG9yKGNvbnRyYXN0LCBsZXZlbHMgPSBjKCJjb250cm9sIFByZSAtIGNvbnRyb2wgRHVyaW5nIiwgImNvbnRyb2wgUHJlIC0gY29udHJvbCBQb3N0IiwiY29udHJvbCBQb3N0IC0gY29udHJvbCBEdXJpbmciICwgIjQgUHJlIC0gNCBEdXJpbmciLCAiNCBQcmUgLSA0IFBvc3QiLCAiNCBQb3N0IC0gNCBEdXJpbmciLCAiMiBQcmUgLSAyIER1cmluZyIsICIyIFByZSAtIDIgUG9zdCIsICIyIFBvc3QgLSAyIER1cmluZyIpKSwgY29sb3IgPSBzdHJva2UsIGZpbGwgPSBzdHJva2UpKSArCiAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKwogIHN0YXRfaGFsZmV5ZSgud2lkdGggPSBjKDAuODksIDAuOTUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoY29sb3VyMTEsIGNvbG91cjEyLCBjb2xvdXIxMykpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBhbHBoYShjKGNvbG91cjEsIGNvbG91cjIsIGNvbG91cjMpLCAwLjgpKSArCiAgbGFicyh4ID0gIkRpZmZlcmVuY2UgaW4gdGhlIHByb3BvcnRpb24gb2YgdGltZSBzcGVudCBvdXQgb2YgdGhlIGJ1cnJvdyIsCiAgICAgICB5ID0gIkNvbnRyYXN0cyBvZiB0aGUgdGltZSBwZXJpb2RzIHJlbGF0aXZlIHRvIG5vaXNlIGV4cG9zdXJlIiwKICAgICAgIGZpbGwgPSAiTm9pc2UgdHJlYXRtZW50IiwgY29sb3IgPSAiTm9pc2UgdHJlYXRtZW50IiwKICAgICAgIGZpbGxfcmFtcCA9ICJDcmVkaWJsZSBpbnRlcnZhbCIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDUwLCBoanVzdCA9MSkpICsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscyA9IGMoIlByZSAtIER1cmluZyIsICJQcmUgLSBQb3N0IiwiUG9zdCAtIER1cmluZyIgLCAiUHJlIC0gRHVyaW5nIiwgIlByZSAtIFBvc3QiLCAiUG9zdCAtIER1cmluZyIsICJQcmUgLSBEdXJpbmciLCAiUHJlIC0gUG9zdCIsICJQb3N0IC0gRHVyaW5nIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0wLjIsIDAuMywgMC4xKSwgbGFiZWxzID0gYygiLTAuMiIsIi0wLjEiICwgIjAiLCAiMC4xIiwgIjAuMiIsICIwLjMiKSwgbGltaXRzID0gYygtMC4yLCAwLjMpKSAKCgpzaHJpbXBfY29udGFjdF90ZW1wb3JhbF9maWcKYGBgCgojIyMyLjUuMyBFeHRyYWN0aW5nIGFuZCBwbG90dGluZyBtb2RlbCBlc3RpbWF0ZXMKIyMjIzIuNS4zLjEgRXh0cmFjdGluZyBlc3RpbWF0ZXMKYGBge3J9CnNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcyA8LSBzaHJpbXBfY29udGFjdF9tb2RlbCB8PiAKICBlbW1lYW5zKH4gc3Ryb2tlKnN0YWdlLAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmcubGltaXQgPSAxNDAwMCwKICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSkKCnNocmltcF9jb250YWN0X21vZGVsIHw+IAogIGVtbWVhbnMofiAxLAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmcubGltaXQgPSAxNDAwMCwKICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSkKCnNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcyA8LSBhcy5kYXRhLmZyYW1lKHNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcykKCnNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcwoKI1N0b3JpbmcgdGhlIG1vZGVsIGVzdGltYXRlIG1lYW5zIGZvciBlYWNoIGdyb3VwIHRvIHBsb3QgbGF0ZXIgb24Kc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzX2NvbnRyb2wgPC0gc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ICJjb250cm9sIikgfD4gCiAgcmVuYW1lKC52YWx1ZSA9IGVtbWVhbikKCnNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlc19mb3VyIDwtIHNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcyB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSAiNCIpfD4gCiAgcmVuYW1lKC52YWx1ZSA9IGVtbWVhbikKCnNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlc190d28gPC0gc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ICIyIil8PiAKICByZW5hbWUoLnZhbHVlID0gZW1tZWFuKQpgYGAKIyMjIzIuNS4zLjIgUGxvdHRpbmcgbW9kZWwgZXN0aW1hdGVzIGFuZCByYXcgZGF0YQpgYGB7cn0Kc2hyaW1wX2NvbnRhY3RfbW9kZWxfZHJhd3MgPC0gc2hyaW1wX2NvbnRhY3RfbW9kZWwgfD4gCiAgZW1tZWFucyh+IHN0cm9rZSpzdGFnZSwKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJnLmxpbWl0ID0gMTQwMDAsCiAgICAgICAgICByZV9mb3JtdWxhID0gTkEpIHw+IAogIGdhdGhlcl9lbW1lYW5zX2RyYXdzKCkKCnNocmltcF9jb250YWN0X21vZGVsX2RyYXdzIDwtIHNocmltcF9jb250YWN0X21vZGVsX2RyYXdzIHw+IAogIHJlbmFtZShlbW1lYW4gPSAudmFsdWUpCgpzaHJpbXBfY29udGFjdF9yYXdfZGF0YSA8LSBmaW5hbF9kZiB8PiAKICByZW5hbWUoZW1tZWFuID0gc2hyaW1wX2NvbnRhY3QpCgpzaHJpbXBfY29udGFjdF9yYXdfZGF0YSRzdGFnZSA8LSBmYWN0b3Ioc2hyaW1wX2NvbnRhY3RfcmF3X2RhdGEkc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKQpzaHJpbXBfY29udGFjdF9yYXdfZGF0YSRzdHJva2UgPC0gZmFjdG9yKHNocmltcF9jb250YWN0X3Jhd19kYXRhJHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0IiwgIjIiKSkKCnNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcyRzdGFnZSA8LSBmYWN0b3Ioc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzJHN0YWdlLCBsZXZlbHMgPSBjKCJQcmUiLCAiRHVyaW5nIiwgIlBvc3QiKSkKc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzJHN0cm9rZSA8LSBmYWN0b3Ioc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzJHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0IiwgIjIiKSkKCnNocmltcF9jb250YWN0X21vZGVsX2RyYXdzJHN0YWdlIDwtIGZhY3RvcihzaHJpbXBfY29udGFjdF9tb2RlbF9kcmF3cyRzdGFnZSwgbGV2ZWxzID0gYygiUHJlIiwgIkR1cmluZyIsICJQb3N0IikpCnNocmltcF9jb250YWN0X21vZGVsX2RyYXdzJHN0cm9rZSA8LSBmYWN0b3Ioc2hyaW1wX2NvbnRhY3RfbW9kZWxfZHJhd3Mkc3Ryb2tlLCBsZXZlbHMgPSBjKCJjb250cm9sIiwgIjQiLCAiMiIpKQoKc2hyaW1wX2NvbnRhY3RfbWVhbnMgPC0gc2hyaW1wX2NvbnRhY3RfcmF3X2RhdGEgfD4gCiAgZ3JvdXBfYnkoc3RhZ2UsIHN0cm9rZSkgfD4gCiAgc3VtbWFyaXNlKGVtbWVhbiA9IG1lYW4oZW1tZWFuKSkKCgpzaHJpbXBfY29udGFjdF9maWdfdG9nZXRoZXIgPC0gZ2dwbG90KGRhdGEgPSBzaHJpbXBfY29udGFjdF9yYXdfZGF0YSwgYWVzKHggPSBzdGFnZSwgeSA9IGVtbWVhbiwgY29sb3IgPSBzdHJva2UsIGZpbGwgPSBzdHJva2UpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gc2hyaW1wX2NvbnRhY3RfbWVhbnMsIGFscGhhID0gMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZW51ZGdlKHdpZHRoID0gMC44LCB4ID0gLTAuMDkpLCBzaXplID0gOSwgc2hhcGUgPSAiXyIpICsKICBnZW9tX2hhbGZfcG9pbnQoYWxwaGEgPSAwLjMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2VudWRnZSh3aWR0aCA9IDAuOCwgeCA9IC0wLjAzKSwgc2lkZSA9ICJsIiwgcmFuZ2Vfc2NhbGUgPSAwLjUpICsKICBnZW9tX2hhbGZfdmlvbGluKGRhdGEgPSBzaHJpbXBfY29udGFjdF9tb2RlbF9kcmF3cywgYWVzKHggPSBzdGFnZSwgeSA9IGVtbWVhbiwgY29sb3IgPSBzdHJva2UsIGZpbGwgPSBzdHJva2UpLCBhbHBoYSA9IDAuNiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHNpZGUgPSAiciIsIHNpemUgPSAwKSArCiAgZ2VvbV9wb2ludChkYXRhID0gc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzLCBhZXMoeCA9IHN0YWdlLCB5ID0gZW1tZWFuLCBjb2xvciA9IHN0cm9rZSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoZGF0YSA9IHNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcywgYWVzKHggPSBzdGFnZSwgeSA9IGVtbWVhbiwgeW1pbiA9IGxvd2VyLkhQRCwgeW1heCA9IHVwcGVyLkhQRCwgY29sb3IgPSBzdHJva2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgd2lkdGggPSAwLCBzaXplID0gMS4yNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImNvbnRyb2wiID0gIiM3NkEzNEEiLCAiNCIgPSAiI0YyOUUwMCIsICIyIiA9ICIjRTI1QTAwIiksIG5hbWUgPSAiTm9pc2UgZXhwb3N1cmUiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzKSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiY29udHJvbCIgPSAiIzJBMzMwRSIsICI0IiA9ICIjODA1MjEzIiwgIjIiID0gIiM1NDI3MDkiKSwgbmFtZSA9ICJOb2lzZSBleHBvc3VyZSIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMpKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiUHJlIiwgIkR1cmluZyIsICJQb3N0IikpICsKICBsYWJzKHRpdGxlID0gIlRoZSBlZmZlY3RzIG9mIGJvYXQgbm9pc2Ugb24gZ29ieS1zaHJpbXAgY29udGFjdCIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgdGltZSB0aGUgaW4gY29udGFjdCIsCiAgICAgICB4ID0gIkV4cGVyaW1lbnRhbCBwaGFzZSByZWxhdGl2ZSB0byBub2lzZSBleHBvc3VyZSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDUpKSwgIAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBtYXJnaW4gPSBtYXJnaW4ociA9IDUpKSwgIAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgbWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgbWFyZ2luID0gbWFyZ2luKHIgPSAxMCkpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gInRvcCIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYpLCAgCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxMCwgMTAsIDEwLCAxMCkKICApCgpzaHJpbXBfY29udGFjdF9maWdfdG9nZXRoZXIKZ2dzYXZlKCIuLzMtZmlncy9zaHJpbXBfY29udGFjdF9maWdfdG9nZXRoZXIucG5nIiwgcGxvdCA9IHNocmltcF9jb250YWN0X2ZpZ190b2dldGhlciwgdW5pdHMgPSAicHgiLCB3aWR0aCA9IDIyMDAsIGhlaWdodCA9IDE0MDAsIGRwaSA9IDMwMCkKYGBgCgoKIyMjIzIuNS4zLjMgUGxvdHRpbmcgY29udHJvbCBlc3RpbWF0ZXMgYW5kIHJhdyBkYXRhCmBgYHtyfQpzaHJpbXBfY29udGFjdF9tb2RlbF9kcmF3cyA8LSBzaHJpbXBfY29udGFjdF9tb2RlbCB8PiAKICBlbW1lYW5zKH4gc3Ryb2tlKnN0YWdlLAogICAgICAgICAgZXByZWQgPSBUUlVFLAogICAgICAgICAgcmcubGltaXQgPSAxNDAwMCwKICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSkgfD4gCiAgZ2F0aGVyX2VtbWVhbnNfZHJhd3MoKQoKc2hyaW1wX2NvbnRhY3RfcmF3X2RhdGEgPC0gZmluYWxfZGYgfD4KICByZW5hbWUoLnZhbHVlID0gc2hyaW1wX2NvbnRhY3QpCgpzaHJpbXBfY29udGFjdF9tb2RlbF9kcmF3cyRzdGFnZSA8LSBmYWN0b3Ioc2hyaW1wX2NvbnRhY3RfbW9kZWxfZHJhd3Mkc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKQpzaHJpbXBfY29udGFjdF9tb2RlbF9kcmF3cyRzdHJva2UgPC0gZmFjdG9yKHNocmltcF9jb250YWN0X21vZGVsX2RyYXdzJHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0IiwgIjIiKSkKCnNocmltcF9jb250YWN0X2NvbnRyb2xfbW9kZWxfZHJhd3MgPC0gc2hyaW1wX2NvbnRhY3RfbW9kZWxfZHJhd3MgfD4gCiAgZHBseXI6OmZpbHRlcihzdHJva2UgPT0gImNvbnRyb2wiKQoKZ29ieV9jb250cm9sX3Jhd19kYXRhIDwtIGZpbmFsX2RmIHw+IAogIGRwbHlyOjpmaWx0ZXIoc3Ryb2tlID09ImNvbnRyb2wiKSB8PiAKICByZW5hbWUoLnZhbHVlID0gc2hyaW1wX2NvbnRhY3QpCgpnb2J5X2NvbnRyb2xfbWVhbnMgPC0gZ29ieV9jb250cm9sX3Jhd19kYXRhIHw+IAogIGdyb3VwX2J5KHN0YWdlKSB8PiAKICBzdW1tYXJpc2UoLnZhbHVlID0gbWVhbigudmFsdWUpKQoKZ29ieV9jb250cm9sX3Jhd19kYXRhJHN0YWdlIDwtIGZhY3Rvcihnb2J5X2NvbnRyb2xfcmF3X2RhdGEkc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKQoKI2Fzc2lnbmluZyBhIHZhbHVlIGZvciB0aGUgYmFzZWxpbmUgbWVhbgpzaHJpbXBfY29udGFjdF9tb2RlbF9lc3RpbWF0ZXNfY29udHJvbF9pbnRlcmNlcHQgPC0gc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzX2NvbnRyb2wgJT4lCiAgZHBseXI6OmZpbHRlcihzdGFnZSA9PSAiUHJlIikgJT4lCiAgcHVsbCgudmFsdWUpCgpzaHJpbXBfY29udGFjdF9maWdfY29udHJvbCA8LSBnZ3Bsb3QoZ29ieV9jb250cm9sX3Jhd19kYXRhLCBhZXMoeSA9IC52YWx1ZSwgeCA9IHN0YWdlLCBmaWxsID0gc3RhZ2UsIGNvbG9yID0gc3RhZ2UpKSArCiAgZ2VvbV9oYWxmX3Zpb2xpbihkYXRhID0gc2hyaW1wX2NvbnRhY3RfY29udHJvbF9tb2RlbF9kcmF3cywgYWxwaGEgPSAwLjcsIHNpemUgPSAwLCBzaWRlID0gInIiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJudWRnZSh4ID0gLTAuMSwgd2lkdGggPSAwLjEsIG51ZGdlLmZyb20gPSAiaml0dGVyZWQiKSwgYWxwaGEgPSAwLjQsIHNpemUgPSAyKSArCiAgZ2VvbV9jcm9zc2JhcihhbHBoYSA9IDAuNiwgc2l6ZSA9IDAuOCwgZGF0YSA9IHNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlc19jb250cm9sLCBhZXMoeW1pbiA9IGxvd2VyLkhQRCwgeW1heCA9IHVwcGVyLkhQRCksIHdpZHRoID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gMC4yKSkrCiAgZ2VvbV9wb2ludChwY2ggPSAyMywgc3Ryb2tlID0gMS4yLCBkYXRhID0gc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzX2NvbnRyb2wsIHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZ29ieV9jb250cm9sX21lYW5zLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlbnVkZ2Uod2lkdGggPSAwLjgsIHggPSAtMC4xKSwgc2l6ZSA9IDksIHNoYXBlID0gIl8iKSArCiAgbGFicyh4PSJQZXJpb2QgcmVsYXRpdmUgdG8gdHJlYXRtZW50IiwKICAgICAgIHk9IlByb3BvcnRpb24gb2YgdGltZSBpbiBjb250YWN0IikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLCAgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIGIgPSAwLCBsID0gMCwgciA9IDEwKSksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dGJveF9zaW1wbGUoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE2LCBoYWxpZ24gPSAwLjUsIGxpbmV3aWR0aCA9IDAuMywgbGluZXR5cGUgPSAxLCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAiI0EzQzA4OCIsIHBhZGRpbmcgPSBtYXJnaW4oNSwgNSwgNSwgNSkpLCAKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSBOQSkpKwogIGdndGl0bGUoIkNvbnRyb2wiKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJQcmUiID0gImRhcmtncmV5IiwgIkR1cmluZyIgPSAiIzc2QTM0QSIsICJQb3N0IiA9ICIjRDNEOUE3IikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiUHJlIiA9ICIjMjQyNDI0IiwgIkR1cmluZyIgPSAiIzJBMzMwRSIsICJQb3N0IiA9ICIjNWQ2MzRjIikpCgpzaHJpbXBfY29udGFjdF9maWdfY29udHJvbApgYGAKIyMjIzIuNS4zLjQgUGxvdHRpbmcgNC1zdHJva2UgZXN0aW1hdGVzIGFuZCByYXcgZGF0YQpgYGB7cn0Kc2hyaW1wX2NvbnRhY3RfY29udHJvbF9tb2RlbF9kcmF3cyA8LSBzaHJpbXBfY29udGFjdF9tb2RlbF9kcmF3cyB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSAiNCIpCgpnb2J5X2ZvdXJfcmF3X2RhdGEgPC0gZmluYWxfZGYgfD4gCiAgZHBseXI6OmZpbHRlcihzdHJva2UgPT0iNCIpIHw+IAogIHJlbmFtZSgudmFsdWUgPSBzaHJpbXBfY29udGFjdCkKCmdvYnlfZm91cl9yYXdfZGF0YSRzdGFnZSA8LSBmYWN0b3IoZ29ieV9mb3VyX3Jhd19kYXRhJHN0YWdlLCBsZXZlbHMgPSBjKCJQcmUiLCAiRHVyaW5nIiwgIlBvc3QiKSkKCmdvYnlfZm91cl9tZWFucyA8LSBnb2J5X2ZvdXJfcmF3X2RhdGEgfD4gCiAgZ3JvdXBfYnkoc3RhZ2UpIHw+IAogIHN1bW1hcmlzZSgudmFsdWUgPSBtZWFuKC52YWx1ZSkpCgpzaHJpbXBfY29udGFjdF9maWdfZm91ciA8LSBnZ3Bsb3QoZ29ieV9mb3VyX3Jhd19kYXRhLCBhZXMoeSA9IC52YWx1ZSwgeCA9IHN0YWdlLCBmaWxsID0gc3RhZ2UsIGNvbG9yID0gc3RhZ2UpKSArCiAgZ2VvbV9oYWxmX3Zpb2xpbihkYXRhID0gc2hyaW1wX2NvbnRhY3RfY29udHJvbF9tb2RlbF9kcmF3cywgYWxwaGEgPSAwLjcsIHNpemUgPSAwLCBzaWRlID0gInIiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJudWRnZSh4ID0gLTAuMSwgd2lkdGggPSAwLjEsIG51ZGdlLmZyb20gPSAiaml0dGVyZWQiKSwgYWxwaGEgPSAwLjQsIHNpemUgPSAyKSArCiAgZ2VvbV9jcm9zc2JhcihhbHBoYSA9IDAuNiwgc2l6ZSA9IDAuOCwgZGF0YSA9IHNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlc19mb3VyLCBhZXMoeW1pbiA9IGxvd2VyLkhQRCwgeW1heCA9IHVwcGVyLkhQRCksIHdpZHRoID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gMC4yKSkrCiAgZ2VvbV9wb2ludChwY2ggPSAyMywgc3Ryb2tlID0gMS4yLCBkYXRhID0gc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzX2ZvdXIsIHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZ29ieV9mb3VyX21lYW5zLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlbnVkZ2Uod2lkdGggPSAwLjgsIHggPSAtMC4xKSwgc2l6ZSA9IDksIHNoYXBlID0gIl8iKSArCiAgeGxhYigiRXhwZXJpbWVudGFsIHBoYXNlIHJlbGF0aXZlIHRvIG5vaXNlIGV4cG9zdXJlIikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksICAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLCAgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiwgbWFyZ2luID0gbWFyZ2luKHQgPSAxNSwgYiA9IDAsIGwgPSAwLCByID0gMCkpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHRib3hfc2ltcGxlKGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNiwgaGFsaWduID0gMC41LCBsaW5ld2lkdGggPSAwLjMsIGxpbmV0eXBlID0gMSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIiNGNkJDNjUiLCBwYWRkaW5nID0gbWFyZ2luKDUsIDUsIDUsIDUpKSwgCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gTkEpKSsKICBnZ3RpdGxlKCI0LXN0cm9rZSIpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlByZSIgPSAiZGFya2dyZXkiLCAiRHVyaW5nIiA9ICIjRjI5RTAwIiwgIlBvc3QiID0gIiNGMkQ1QTAiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJQcmUiID0gIiMyNDI0MjQiLCAiRHVyaW5nIiA9ICIjODA1MjEzIiwgIlBvc3QiID0gIiM3MDUzMmIiKSkKCnNocmltcF9jb250YWN0X2ZpZ19mb3VyCmBgYAoKIyMjIzIuNS4zLjUgUGxvdHRpbmcgMi1zdHJva2UgZXN0aW1hdGVzIGFuZCByYXcgZGF0YQpgYGB7cn0Kc2hyaW1wX2NvbnRhY3RfY29udHJvbF9tb2RlbF9kcmF3cyA8LSBzaHJpbXBfY29udGFjdF9tb2RlbF9kcmF3cyB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSAiMiIpCgpnb2J5X3R3b19yYXdfZGF0YSA8LSBmaW5hbF9kZiB8PiAKICBkcGx5cjo6ZmlsdGVyKHN0cm9rZSA9PSIyIikgfD4gCiAgcmVuYW1lKC52YWx1ZSA9IHNocmltcF9jb250YWN0KQoKZ29ieV90d29fcmF3X2RhdGEkc3RhZ2UgPC0gZmFjdG9yKGdvYnlfdHdvX3Jhd19kYXRhJHN0YWdlLCBsZXZlbHMgPSBjKCJQcmUiLCAiRHVyaW5nIiwgIlBvc3QiKSkKCmdvYnlfdHdvX21lYW5zIDwtIGdvYnlfdHdvX3Jhd19kYXRhIHw+IAogIGdyb3VwX2J5KHN0YWdlKSB8PiAKICBzdW1tYXJpc2UoLnZhbHVlID0gbWVhbigudmFsdWUpKQoKc2hyaW1wX2NvbnRhY3RfZmlnX3R3byA8LSBnZ3Bsb3QoZ29ieV90d29fcmF3X2RhdGEsIGFlcyh5ID0gLnZhbHVlLCB4ID0gc3RhZ2UsIGZpbGwgPSBzdGFnZSwgY29sb3IgPSBzdGFnZSkpICsKICBnZW9tX2hhbGZfdmlvbGluKGRhdGEgPSBzaHJpbXBfY29udGFjdF9jb250cm9sX21vZGVsX2RyYXdzLCBhbHBoYSA9IDAuNywgc2l6ZSA9IDAsIHNpZGUgPSAiciIsIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAuMikpICsKICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcm51ZGdlKHggPSAtMC4xLCB3aWR0aCA9IDAuMSwgbnVkZ2UuZnJvbSA9ICJqaXR0ZXJlZCIpLCBhbHBoYSA9IDAuNCwgc2l6ZSA9IDIpICsKICBnZW9tX2Nyb3NzYmFyKGFscGhhID0gMC42LCBzaXplID0gMC44LCBkYXRhID0gc2hyaW1wX2NvbnRhY3RfbW9kZWxfZXN0aW1hdGVzX3R3bywgYWVzKHltaW4gPSBsb3dlci5IUEQsIHltYXggPSB1cHBlci5IUEQpLCB3aWR0aCA9IDAsIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAuMikpKwogIGdlb21fcG9pbnQocGNoID0gMjMsIHN0cm9rZSA9IDEuMiwgZGF0YSA9IHNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlc190d28sIHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAwLjIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZ29ieV90d29fbWVhbnMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2VudWRnZSh3aWR0aCA9IDAuOCwgeCA9IC0wLjEpLCBzaXplID0gOSwgc2hhcGUgPSAiXyIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMyksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0Ym94X3NpbXBsZShmYWNlID0gImJvbGQiLCBzaXplID0gMTYsIGhhbGlnbiA9IDAuNSwgbGluZXdpZHRoID0gMC4zLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICIjRUI5MDYzIiwgcGFkZGluZyA9IG1hcmdpbig1LCA1LCA1LCA1KSksIAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG91ciA9IE5BKSkrCiAgZ2d0aXRsZSgiMi1zdHJva2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiUHJlIiA9ICJkYXJrZ3JleSIsICJEdXJpbmciID0gIiNFMjVBMDAiLCAiUG9zdCIgPSAiI0YyQjM4OSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIlByZSIgPSAiIzI0MjQyNCIsICJEdXJpbmciID0gIiM1NDI3MDkiLCAiUG9zdCIgPSAiIzY2NDIyYSIpKQoKc2hyaW1wX2NvbnRhY3RfZmlnX3R3bwpgYGAKIyMjIzIuNS4zLjYgQ29tYmluaW5nIHBsb3RzIGludG8gb25lIGZpZ3VyZQpgYGB7cn0Kc2hyaW1wX2NvbnRhY3RfcGxvdDMgPC0gc2hyaW1wX2NvbnRhY3RfZmlnX2NvbnRyb2wgKyBzaHJpbXBfY29udGFjdF9maWdfZm91ciArIHNocmltcF9jb250YWN0X2ZpZ190d28gKyAKICBwbG90X2xheW91dChuY29sID0gMykKCnNocmltcF9jb250YWN0X3Bsb3QzCmdnc2F2ZSgiLi8zLWZpZ3Mvc2hyaW1wX2NvbnRhY3RfcGxvdDMuanBlZyIsIHBsb3QgPSBzaHJpbXBfY29udGFjdF9wbG90MywgdW5pdHMgPSAicHgiLCB3aWR0aCA9IDIyMDAsIGhlaWdodCA9IDE0MDAsIGRwaSA9IDMwMCkKYGBgCgojIyMyLjUuNCBNb2RlbGxpbmcgdGhlIGVmZmVjdCBvZiBjb3ZhcmlhdGVzIG9uIHRoZSBwcm9wb3J0aW9uIG9mIHRpbWUgc3BlbnQgaW4gY29udGFjdAojIyMjMi41LjQuMSBHb2J5IG51bWJlcgpgYGB7cn0Kc2hyaW1wX2NvbnRhY3RfZ29ieV9udW1iZXJfY29udHJhc3RzIDwtIHNocmltcF9jb250YWN0X21vZGVsIHw+CiAgZW1tZWFucyh+IGdvYnlfbnVtYmVyLCAKICAgICAgICAgIGVwcmVkID0gVFJVRSwKICAgICAgICAgIHJlX2Zvcm1sYSA9IE5VTEwsCiAgICAgICAgICByZy5saW1pdCA9MTQwMDApIHw+IAogIGNvbnRyYXN0KG1ldGhvZCA9ICJyZXZwYWlyd2lzZSIpIAoKc2hyaW1wX2NvbnRhY3RfZ29ieV9udW1iZXJfY29udHJhc3RzCmBgYAoKIyMjIzIuNS40LjIgU2hyaW1wIG51bWJlcgpgYGB7cn0Kc2hyaW1wX2NvbnRhY3Rfc2hyaW1wX251bWJlcl9jb250cmFzdHMgPC0gc2hyaW1wX2NvbnRhY3RfbW9kZWwgfD4KICBlbW1lYW5zKH4gc2hyaW1wX251bWJlciwgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMLAogICAgICAgICAgcmcubGltaXQgPTE0MDAwKSB8PiAKICBjb250cmFzdChtZXRob2QgPSAicmV2cGFpcndpc2UiKSAKCnNocmltcF9jb250YWN0X3NocmltcF9udW1iZXJfY29udHJhc3RzCmBgYAoKIyMjIzIuNS40LjIgU2hyaW1wIHNwZWNpZXMKYGBge3J9CnNocmltcF9jb250YWN0X3NocmltcF9zcGVjaWVzX2NvbnRyYXN0cyA8LSBzaHJpbXBfY29udGFjdF9tb2RlbCB8PgogIGVtbWVhbnMofiBzaHJpbXBfc3BlY2llcywgCiAgICAgICAgICBlcHJlZCA9IFRSVUUsCiAgICAgICAgICByZV9mb3JtbGEgPSBOVUxMLAogICAgICAgICAgcmcubGltaXQgPTE0MDAwKSB8PiAKICBjb250cmFzdChtZXRob2QgPSAicmV2cGFpcndpc2UiKSAKCnNocmltcF9jb250YWN0X3NocmltcF9zcGVjaWVzX2NvbnRyYXN0cwpgYGAKCiMzIE1hbnVzY3JpcHQgb3V0cHV0IGZpbGVzCiMjMy4xIFN1cHAgdGFibGVzCiMjIzMuMS4xIE1vZGVsIGVzdGltYXRlcwpgYGB7cn0KZ29ieV9vdXRfbW9kZWxfZXN0aW1hdGVzIDwtIGdvYnlfb3V0X21vZGVsX2VzdGltYXRlcyB8PiAKICBtdXRhdGUoYEJlaGF2aW91cmFsIG1lYXN1cmVgID0gIlByb3BvcnRpb24gb2YgdGltZSBnb2JpZXMgc3BlbnQgb3V0c2lkZSBvZiB0aGUgYnVycm93IikKICAKc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXMgPC0gc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXMgfD4gCiAgbXV0YXRlKGBCZWhhdmlvdXJhbCBtZWFzdXJlYCA9ICJQcm9wb3J0aW9uIG9mIHRpbWUgc2hyaW1wIHNwZW50IG91dHNpZGUgb2YgdGhlIGJ1cnJvdyIpCiAgCnNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcyA8LSBzaHJpbXBfY29udGFjdF9tb2RlbF9lc3RpbWF0ZXMgfD4gCiAgbXV0YXRlKGBCZWhhdmlvdXJhbCBtZWFzdXJlYCA9ICJQcm9wb3J0aW9uIG9mIHRpbWUgc2hyaW1wIHNwZW50IGluIGNvbnRhY3Qgd2l0aCBhIGdvYnkiKQogIAptb2RlbF9lc3RpbWF0ZXMgPC0gYmluZF9yb3dzKGdvYnlfb3V0X21vZGVsX2VzdGltYXRlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hyaW1wX291dF9tb2RlbF9lc3RpbWF0ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNocmltcF9jb250YWN0X21vZGVsX2VzdGltYXRlcykKCm1vZGVsX2VzdGltYXRlcyA8LSBtb2RlbF9lc3RpbWF0ZXMgfD4KICBtdXRhdGUoc3Ryb2tlID0gaWZlbHNlKHN0cm9rZSA9PSAiNCIsICI0LXN0cm9rZSIsIGlmZWxzZShzdHJva2UgPT0gIjIiLCAiMi1zdHJva2UiLCAiY29udHJvbCIpKSwKICAgICAgICAgc3Ryb2tlID0gZmFjdG9yKHN0cm9rZSwgbGV2ZWxzID0gYygiY29udHJvbCIsICI0LXN0cm9rZSIsICIyLXN0cm9rZSIpKSwKICAgICAgICAgc3RhZ2UgPSBmYWN0b3Ioc3RhZ2UsIGxldmVscyA9IGMoIlByZSIsICJEdXJpbmciLCAiUG9zdCIpKSwKICAgICAgICAgYEJlaGF2aW91cmFsIG1lYXN1cmVgID0gZmFjdG9yKGBCZWhhdmlvdXJhbCBtZWFzdXJlYCwgbGV2ZWxzID0gYygiUHJvcG9ydGlvbiBvZiB0aW1lIGdvYmllcyBzcGVudCBvdXRzaWRlIG9mIHRoZSBidXJyb3ciLCAiUHJvcG9ydGlvbiBvZiB0aW1lIHNocmltcCBzcGVudCBvdXRzaWRlIG9mIHRoZSBidXJyb3ciLCAiUHJvcG9ydGlvbiBvZiB0aW1lIHNocmltcCBzcGVudCBpbiBjb250YWN0IHdpdGggYSBnb2J5IikpKSB8PgogIGFycmFuZ2UoYEJlaGF2aW91cmFsIG1lYXN1cmVgLCBzdGFnZSwgc3Ryb2tlKSB8PiAKICByZW5hbWUoYEVzdGltYXRlZCBtYXJnaW5hbCBtZWFuYCA9IGVtbWVhbiwKICAgICAgICAgYExvd2VyIDk1JSBDcklgID0gbG93ZXIuSFBELAogICAgICAgICBgVXBwZXIgOTUlIENySWAgPSB1cHBlci5IUEQsCiAgICAgICAgIFBoYXNlID0gc3RhZ2UsCiAgICAgICAgIGBOb2lzZSBleHBvc3VyZWAgPSBzdHJva2UpIHw+IAogIHNlbGVjdChjKGBCZWhhdmlvdXJhbCBtZWFzdXJlYCwgUGhhc2UsIGBOb2lzZSBleHBvc3VyZWAsIGBFc3RpbWF0ZWQgbWFyZ2luYWwgbWVhbmAsIGBMb3dlciA5NSUgQ3JJYCwgYFVwcGVyIDk1JSBDcklgKSkKCndyaXRlX2Nzdihtb2RlbF9lc3RpbWF0ZXMsICIuLzItZGF0YS9tb2RlbF9lc3RpbWF0ZXMuY3N2IikKYGBgCgojIyMzLjEuMiBQYWlyd2lzZSBjb250cmFzdHMKYGBge3J9CiNnb2J5IG91dApnb2J5X291dF9jb250cmFzdHMgPC0gZ29ieV9vdXRfcmVzdWx0cy50YWJsZSB8PiAKICBtdXRhdGUoYFByZWRpY3RvciB2YXJpYWJsZWAgPSAiVHJlYXRtZW50IGFuZCBwaGFzZSBpbnRlcmFjdGlvbiIsCiAgICAgICAgIGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCAiXFxiMlxcYiIsICIyLVN0cm9rZSIpLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYjRcXGIiLCAiNC1TdHJva2UiKSwKICAgICAgICAgY29udHJhc3QgPSBzdHJfcmVwbGFjZV9hbGwoY29udHJhc3QsICJcXGJjb250cm9sXFxiIiwgIkNvbnRyb2wiKQogICAgICAgICApIHw+IAogIHJlbmFtZShgRXN0aW1hdGVkIG1hcmdpbmFsIGRpZmZlcmVuY2VgID0gZXN0aW1hdGUsCiAgICAgICAgIGBMb3dlciA5NSUgQ3JJYCA9IGxvd2VyLkhQRCwKICAgICAgICAgYFVwcGVyIDk1JSBDcklgID0gdXBwZXIuSFBELAogICAgICAgICBDb250cmFzdCA9IGNvbnRyYXN0KSB8PiAKICBzZWxlY3QoYyhgUHJlZGljdG9yIHZhcmlhYmxlYCwgQ29udHJhc3QsIGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAsIGBMb3dlciA5NSUgQ3JJYCwgYFVwcGVyIDk1JSBDcklgKSkKCmdvYnlfb3V0X2dvYnlfbnVtYmVyMSA8LSBnb2J5X291dF9nb2J5X251bWJlciB8PgogIGFzLmRhdGEuZnJhbWUoKSB8PiAKICBtdXRhdGUoYFByZWRpY3RvciB2YXJpYWJsZWAgPSAiTnVtYmVyIG9mIGdvYmllcyIsCiAgICAgICAgIGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCAiXFxiZ29ieV9udW1iZXIyXFxiIiwgIjIgZ29iaWVzIiksCiAgICAgICAgIGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCAiXFxiZ29ieV9udW1iZXIxXFxiIiwgIjEgZ29ieSIpCiAgICAgICAgICkgfD4gCiAgcmVuYW1lKGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAgPSBlc3RpbWF0ZSwKICAgICAgICAgYExvd2VyIDk1JSBDcklgID0gbG93ZXIuSFBELAogICAgICAgICBgVXBwZXIgOTUlIENySWAgPSB1cHBlci5IUEQsCiAgICAgICAgIENvbnRyYXN0ID0gY29udHJhc3QpIHw+IAogIHNlbGVjdChjKGBQcmVkaWN0b3IgdmFyaWFibGVgLCBDb250cmFzdCwgYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCwgYExvd2VyIDk1JSBDcklgLCBgVXBwZXIgOTUlIENySWApKQogIApnb2J5X291dF9zaHJpbXBfbnVtYmVyMSA8LSBnb2J5X291dF9zaHJpbXBfbnVtYmVyIHw+IAogIGFzLmRhdGEuZnJhbWUoKSB8PiAKICBtdXRhdGUoYFByZWRpY3RvciB2YXJpYWJsZWAgPSAiTnVtYmVyIG9mIHNocmltcCIsCiAgICAgICAgIGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCAiXFxic2hyaW1wX251bWJlcjJcXGIiLCAiMiBzaHJpbXAiKSwKICAgICAgICAgY29udHJhc3QgPSBzdHJfcmVwbGFjZV9hbGwoY29udHJhc3QsICJcXGJzaHJpbXBfbnVtYmVyMVxcYiIsICIxIHNocmltcCIpLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYnNocmltcF9udW1iZXIzXFxiIiwgIjMgc2hyaW1wIikKICAgICAgICAgKSB8PiAKICByZW5hbWUoYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCA9IGVzdGltYXRlLAogICAgICAgICBgTG93ZXIgOTUlIENySWAgPSBsb3dlci5IUEQsCiAgICAgICAgIGBVcHBlciA5NSUgQ3JJYCA9IHVwcGVyLkhQRCwKICAgICAgICAgQ29udHJhc3QgPSBjb250cmFzdCkgfD4gCiAgc2VsZWN0KGMoYFByZWRpY3RvciB2YXJpYWJsZWAsIENvbnRyYXN0LCBgRXN0aW1hdGVkIG1hcmdpbmFsIGRpZmZlcmVuY2VgLCBgTG93ZXIgOTUlIENySWAsIGBVcHBlciA5NSUgQ3JJYCkpCgpnb2J5X291dF9zaHJpbXBfc3BlY2llczEgPC0gZ29ieV9vdXRfc2hyaW1wX3NwZWNpZXMgfD4gCiAgYXMuZGF0YS5mcmFtZSgpIHw+IAogIG11dGF0ZShgUHJlZGljdG9yIHZhcmlhYmxlYCA9ICJTaHJpbXAgc3BlY2llcyIKICAgICAgICAgKSB8PiAKICByZW5hbWUoYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCA9IGVzdGltYXRlLAogICAgICAgICBgTG93ZXIgOTUlIENySWAgPSBsb3dlci5IUEQsCiAgICAgICAgIGBVcHBlciA5NSUgQ3JJYCA9IHVwcGVyLkhQRCwKICAgICAgICAgQ29udHJhc3QgPSBjb250cmFzdCkgfD4gCiAgc2VsZWN0KGMoYFByZWRpY3RvciB2YXJpYWJsZWAsIENvbnRyYXN0LCBgRXN0aW1hdGVkIG1hcmdpbmFsIGRpZmZlcmVuY2VgLCBgTG93ZXIgOTUlIENySWAsIGBVcHBlciA5NSUgQ3JJYCkpCgpnb2J5X291dF9jb250cmFzdHNfdGFibGUgPC0gcmJpbmQoZ29ieV9vdXRfY29udHJhc3RzLCBnb2J5X291dF9nb2J5X251bWJlcjEsIGdvYnlfb3V0X3NocmltcF9udW1iZXIxLCBnb2J5X291dF9zaHJpbXBfc3BlY2llczEpIHw+CiAgbXV0YXRlKAogICAgYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCA9IHJvdW5kKGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAsIDMpLAogICAgYExvd2VyIDk1JSBDcklgID0gcm91bmQoYExvd2VyIDk1JSBDcklgLCAzKSwKICAgIGBVcHBlciA5NSUgQ3JJYCA9IHJvdW5kKGBVcHBlciA5NSUgQ3JJYCwgMykKICApCgp3cml0ZV9jc3YoZ29ieV9vdXRfY29udHJhc3RzX3RhYmxlLCAiLi8yLWRhdGEvZ29ieV9vdXRfY29udHJhc3RzX3RhYmxlLmNzdiIpCgojc2hyaW1wIG91dApzaHJpbXBfb3V0X2NvbnRyYXN0czEgPC0gc2hyaW1wX291dF9jb250cmFzdHMgfD4gCiAgbXV0YXRlKGBQcmVkaWN0b3IgdmFyaWFibGVgID0gIlRyZWF0bWVudCBhbmQgcGhhc2UgaW50ZXJhY3Rpb24iLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYjJcXGIiLCAiMi1TdHJva2UiKSwKICAgICAgICAgY29udHJhc3QgPSBzdHJfcmVwbGFjZV9hbGwoY29udHJhc3QsICJcXGI0XFxiIiwgIjQtU3Ryb2tlIiksCiAgICAgICAgIGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCAiXFxiY29udHJvbFxcYiIsICJDb250cm9sIikKICAgICAgICAgKSB8PiAKICByZW5hbWUoYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCA9IGVzdGltYXRlLAogICAgICAgICBgTG93ZXIgOTUlIENySWAgPSBsb3dlci5IUEQsCiAgICAgICAgIGBVcHBlciA5NSUgQ3JJYCA9IHVwcGVyLkhQRCwKICAgICAgICAgQ29udHJhc3QgPSBjb250cmFzdCkgfD4gCiAgc2VsZWN0KGMoYFByZWRpY3RvciB2YXJpYWJsZWAsIENvbnRyYXN0LCBgRXN0aW1hdGVkIG1hcmdpbmFsIGRpZmZlcmVuY2VgLCBgTG93ZXIgOTUlIENySWAsIGBVcHBlciA5NSUgQ3JJYCkpCgpzaHJpbXBfb3V0X2dvYnlfbnVtYmVyX2NvbnRyYXN0czEgPC0gc2hyaW1wX291dF9nb2J5X251bWJlcl9jb250cmFzdHMgfD4KICBhcy5kYXRhLmZyYW1lKCkgfD4gCiAgbXV0YXRlKGBQcmVkaWN0b3IgdmFyaWFibGVgID0gIk51bWJlciBvZiBnb2JpZXMiLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYmdvYnlfbnVtYmVyMlxcYiIsICIyIGdvYmllcyIpLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYmdvYnlfbnVtYmVyMVxcYiIsICIxIGdvYnkiKQogICAgICAgICApIHw+IAogIHJlbmFtZShgRXN0aW1hdGVkIG1hcmdpbmFsIGRpZmZlcmVuY2VgID0gZXN0aW1hdGUsCiAgICAgICAgIGBMb3dlciA5NSUgQ3JJYCA9IGxvd2VyLkhQRCwKICAgICAgICAgYFVwcGVyIDk1JSBDcklgID0gdXBwZXIuSFBELAogICAgICAgICBDb250cmFzdCA9IGNvbnRyYXN0KSB8PiAKICBzZWxlY3QoYyhgUHJlZGljdG9yIHZhcmlhYmxlYCwgQ29udHJhc3QsIGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAsIGBMb3dlciA5NSUgQ3JJYCwgYFVwcGVyIDk1JSBDcklgKSkKICAKc2hyaW1wX291dF9zaHJpbXBfbnVtYmVyX2NvbnRyYXN0czEgPC0gc2hyaW1wX291dF9zaHJpbXBfbnVtYmVyX2NvbnRyYXN0cyB8PiAKICBhcy5kYXRhLmZyYW1lKCkgfD4gCiAgbXV0YXRlKGBQcmVkaWN0b3IgdmFyaWFibGVgID0gIk51bWJlciBvZiBzaHJpbXAiLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYnNocmltcF9udW1iZXIyXFxiIiwgIjIgc2hyaW1wIiksCiAgICAgICAgIGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCAiXFxic2hyaW1wX251bWJlcjFcXGIiLCAiMSBzaHJpbXAiKSwKICAgICAgICAgY29udHJhc3QgPSBzdHJfcmVwbGFjZV9hbGwoY29udHJhc3QsICJcXGJzaHJpbXBfbnVtYmVyM1xcYiIsICIzIHNocmltcCIpCiAgICAgICAgICkgfD4gCiAgcmVuYW1lKGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAgPSBlc3RpbWF0ZSwKICAgICAgICAgYExvd2VyIDk1JSBDcklgID0gbG93ZXIuSFBELAogICAgICAgICBgVXBwZXIgOTUlIENySWAgPSB1cHBlci5IUEQsCiAgICAgICAgIENvbnRyYXN0ID0gY29udHJhc3QpIHw+IAogIHNlbGVjdChjKGBQcmVkaWN0b3IgdmFyaWFibGVgLCBDb250cmFzdCwgYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCwgYExvd2VyIDk1JSBDcklgLCBgVXBwZXIgOTUlIENySWApKQoKc2hyaW1wX291dF9zaHJpbXBfc3BlY2llc19jb250cmFzdHMxIDwtIHNocmltcF9vdXRfc2hyaW1wX3NwZWNpZXNfY29udHJhc3RzIHw+IAogIGFzLmRhdGEuZnJhbWUoKSB8PiAKICBtdXRhdGUoYFByZWRpY3RvciB2YXJpYWJsZWAgPSAiU2hyaW1wIHNwZWNpZXMiCiAgICAgICAgICkgfD4gCiAgcmVuYW1lKGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAgPSBlc3RpbWF0ZSwKICAgICAgICAgYExvd2VyIDk1JSBDcklgID0gbG93ZXIuSFBELAogICAgICAgICBgVXBwZXIgOTUlIENySWAgPSB1cHBlci5IUEQsCiAgICAgICAgIENvbnRyYXN0ID0gY29udHJhc3QpIHw+IAogIHNlbGVjdChjKGBQcmVkaWN0b3IgdmFyaWFibGVgLCBDb250cmFzdCwgYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCwgYExvd2VyIDk1JSBDcklgLCBgVXBwZXIgOTUlIENySWApKQoKc2hyaW1wX291dF9jb250cmFzdHNfdGFibGUgPC0gcmJpbmQoc2hyaW1wX291dF9jb250cmFzdHMxLCBzaHJpbXBfb3V0X2dvYnlfbnVtYmVyX2NvbnRyYXN0czEsIHNocmltcF9vdXRfc2hyaW1wX251bWJlcl9jb250cmFzdHMxLCBzaHJpbXBfb3V0X3NocmltcF9zcGVjaWVzX2NvbnRyYXN0czEpIHw+CiAgbXV0YXRlKAogICAgYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCA9IHJvdW5kKGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAsIDMpLAogICAgYExvd2VyIDk1JSBDcklgID0gcm91bmQoYExvd2VyIDk1JSBDcklgLCAzKSwKICAgIGBVcHBlciA5NSUgQ3JJYCA9IHJvdW5kKGBVcHBlciA5NSUgQ3JJYCwgMykKICApCgp3cml0ZV9jc3Yoc2hyaW1wX291dF9jb250cmFzdHNfdGFibGUsICIuLzItZGF0YS9zaHJpbXBfb3V0X2NvbnRyYXN0c190YWJsZS5jc3YiKQoKI3NocmltcCBjb250YWN0CnNocmltcF9jb250YWN0X2NvbnRyYXN0czEgPC0gc2hyaW1wX2NvbnRhY3RfY29udHJhc3RzIHw+IAogIG11dGF0ZShgUHJlZGljdG9yIHZhcmlhYmxlYCA9ICJUcmVhdG1lbnQgYW5kIHBoYXNlIGludGVyYWN0aW9uIiwKICAgICAgICAgY29udHJhc3QgPSBzdHJfcmVwbGFjZV9hbGwoY29udHJhc3QsICJcXGIyXFxiIiwgIjItU3Ryb2tlIiksCiAgICAgICAgIGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCAiXFxiNFxcYiIsICI0LVN0cm9rZSIpLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYmNvbnRyb2xcXGIiLCAiQ29udHJvbCIpCiAgICAgICAgICkgfD4gCiAgcmVuYW1lKGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAgPSBlc3RpbWF0ZSwKICAgICAgICAgYExvd2VyIDk1JSBDcklgID0gbG93ZXIuSFBELAogICAgICAgICBgVXBwZXIgOTUlIENySWAgPSB1cHBlci5IUEQsCiAgICAgICAgIENvbnRyYXN0ID0gY29udHJhc3QpIHw+IAogIHNlbGVjdChjKGBQcmVkaWN0b3IgdmFyaWFibGVgLCBDb250cmFzdCwgYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCwgYExvd2VyIDk1JSBDcklgLCBgVXBwZXIgOTUlIENySWApKQoKc2hyaW1wX2NvbnRhY3RfZ29ieV9udW1iZXJfY29udHJhc3RzMSA8LSBzaHJpbXBfY29udGFjdF9nb2J5X251bWJlcl9jb250cmFzdHMgfD4KICBhcy5kYXRhLmZyYW1lKCkgfD4gCiAgbXV0YXRlKGBQcmVkaWN0b3IgdmFyaWFibGVgID0gIk51bWJlciBvZiBnb2JpZXMiLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYmdvYnlfbnVtYmVyMlxcYiIsICIyIGdvYmllcyIpLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYmdvYnlfbnVtYmVyMVxcYiIsICIxIGdvYnkiKQogICAgICAgICApIHw+IAogIHJlbmFtZShgRXN0aW1hdGVkIG1hcmdpbmFsIGRpZmZlcmVuY2VgID0gZXN0aW1hdGUsCiAgICAgICAgIGBMb3dlciA5NSUgQ3JJYCA9IGxvd2VyLkhQRCwKICAgICAgICAgYFVwcGVyIDk1JSBDcklgID0gdXBwZXIuSFBELAogICAgICAgICBDb250cmFzdCA9IGNvbnRyYXN0KSB8PiAKICBzZWxlY3QoYyhgUHJlZGljdG9yIHZhcmlhYmxlYCwgQ29udHJhc3QsIGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAsIGBMb3dlciA5NSUgQ3JJYCwgYFVwcGVyIDk1JSBDcklgKSkKCnNocmltcF9jb250YWN0X3NocmltcF9udW1iZXJfY29udHJhc3RzMSA8LSBzaHJpbXBfY29udGFjdF9zaHJpbXBfbnVtYmVyX2NvbnRyYXN0cyB8PiAKICBhcy5kYXRhLmZyYW1lKCkgfD4gCiAgbXV0YXRlKGBQcmVkaWN0b3IgdmFyaWFibGVgID0gIk51bWJlciBvZiBzaHJpbXAiLAogICAgICAgICBjb250cmFzdCA9IHN0cl9yZXBsYWNlX2FsbChjb250cmFzdCwgIlxcYnNocmltcF9udW1iZXIyXFxiIiwgIjIgc2hyaW1wIiksCiAgICAgICAgIGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCAiXFxic2hyaW1wX251bWJlcjFcXGIiLCAiMSBzaHJpbXAiKSwKICAgICAgICAgY29udHJhc3QgPSBzdHJfcmVwbGFjZV9hbGwoY29udHJhc3QsICJcXGJzaHJpbXBfbnVtYmVyM1xcYiIsICIzIHNocmltcCIpCiAgICAgICAgICkgfD4gCiAgcmVuYW1lKGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAgPSBlc3RpbWF0ZSwKICAgICAgICAgYExvd2VyIDk1JSBDcklgID0gbG93ZXIuSFBELAogICAgICAgICBgVXBwZXIgOTUlIENySWAgPSB1cHBlci5IUEQsCiAgICAgICAgIENvbnRyYXN0ID0gY29udHJhc3QpIHw+IAogIHNlbGVjdChjKGBQcmVkaWN0b3IgdmFyaWFibGVgLCBDb250cmFzdCwgYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCwgYExvd2VyIDk1JSBDcklgLCBgVXBwZXIgOTUlIENySWApKQoKc2hyaW1wX2NvbnRhY3Rfc2hyaW1wX3NwZWNpZXNfY29udHJhc3RzMSA8LSBzaHJpbXBfY29udGFjdF9zaHJpbXBfc3BlY2llc19jb250cmFzdHMgfD4gCiAgYXMuZGF0YS5mcmFtZSgpIHw+IAogIG11dGF0ZShgUHJlZGljdG9yIHZhcmlhYmxlYCA9ICJTaHJpbXAgc3BlY2llcyIKICAgICAgICAgKSB8PiAKICByZW5hbWUoYEVzdGltYXRlZCBtYXJnaW5hbCBkaWZmZXJlbmNlYCA9IGVzdGltYXRlLAogICAgICAgICBgTG93ZXIgOTUlIENySWAgPSBsb3dlci5IUEQsCiAgICAgICAgIGBVcHBlciA5NSUgQ3JJYCA9IHVwcGVyLkhQRCwKICAgICAgICAgQ29udHJhc3QgPSBjb250cmFzdCkgfD4gCiAgc2VsZWN0KGMoYFByZWRpY3RvciB2YXJpYWJsZWAsIENvbnRyYXN0LCBgRXN0aW1hdGVkIG1hcmdpbmFsIGRpZmZlcmVuY2VgLCBgTG93ZXIgOTUlIENySWAsIGBVcHBlciA5NSUgQ3JJYCkpCgpzaHJpbXBfY29udGFjdF9jb250cmFzdHNfdGFibGUgPC0gcmJpbmQoc2hyaW1wX2NvbnRhY3RfY29udHJhc3RzMSwgc2hyaW1wX2NvbnRhY3RfZ29ieV9udW1iZXJfY29udHJhc3RzMSwgc2hyaW1wX2NvbnRhY3Rfc2hyaW1wX251bWJlcl9jb250cmFzdHMxLCBzaHJpbXBfY29udGFjdF9zaHJpbXBfc3BlY2llc19jb250cmFzdHMxKSB8PgogIG11dGF0ZSgKICAgIGBFc3RpbWF0ZWQgbWFyZ2luYWwgZGlmZmVyZW5jZWAgPSByb3VuZChgRXN0aW1hdGVkIG1hcmdpbmFsIGRpZmZlcmVuY2VgLCAzKSwKICAgIGBMb3dlciA5NSUgQ3JJYCA9IHJvdW5kKGBMb3dlciA5NSUgQ3JJYCwgMyksCiAgICBgVXBwZXIgOTUlIENySWAgPSByb3VuZChgVXBwZXIgOTUlIENySWAsIDMpCiAgKQoKd3JpdGVfY3N2KHNocmltcF9jb250YWN0X2NvbnRyYXN0c190YWJsZSwgIi4vMi1kYXRhL3NocmltcF9jb250YWN0X2NvbnRyYXN0c190YWJsZS5jc3YiKQpgYGAKCmBgYHtyfQp0YWJsZV9TMSA8LSBmaW5hbF9kZiAlPiUKICBzZWxlY3QoYygiYnVycm93IiwgInN0cm9rZSIsICJzaXRlIikpIHw+IAogIHVuaXF1ZSgpIHw+IAogIGdyb3VwX2J5KHNpdGUsIHN0cm9rZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzdHJva2UsIHZhbHVlc19mcm9tID0gbiwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICBtdXRhdGUoVG90YWwgPSBgY29udHJvbGAgKyBgNGAgKyBgMmApICU+JQogIGFycmFuZ2Uoc2l0ZSkgJT4lCiAgcmVuYW1lKGA0LXN0cm9rZWAgPSBgNGAsIAogICAgICAgICBgMi1zdHJva2VgID0gYDJgLCAKICAgICAgICAgQ29udHJvbCA9IGNvbnRyb2wpCmBgYAoK